此正则表达式模式的 C# 等价物

C# equivalent for this regex pattern

我有这个正则表达式模式:.{2}\@.{2}\K|\..*(*SKIP)(?!)|.(?=.*\.)

它可以完美地转换以替换匹配项以获得

trabc@abtrec.com.lo => ***bc@ab*****.com.lo

demomail@demodomain.com => ******il@de*********.com

但是当我尝试在 C# 上使用它时,不允许使用 \K 和 (*SKIP) 和 (*F)。

此模式的 c# 版本是什么?或者您是否知道在没有不受支持的模式条目的情况下屏蔽电子邮件的更简单方法?

Demo

更新:

(*SKIP):如果模式的其余部分不匹配,这个动词会导致匹配在主题中的当前起始位置失败

(*F):在模式中的给定位置强制匹配失败(与 (?!)

相同

试试这个正则表达式:

\w(?=.{2,}@)|(?<=@[^\.]{2,})\w

Click for Demo

解释:

  • \w - 匹配一个单词字符
  • (?=.{2,}@) - 正向超前查找紧接着任何字符出现 2 次以上后跟 @
  • 的位置
  • | - 或者
  • (?<=@[^\.]{2,}) - 正向后视查找紧接在 @ 之前的位置,后跟出现 2+ 次非 .
  • 的任何字符
  • \w - 匹配一个单词字符。

*

替换每个匹配项

您可以使用匹配一个块中的项目的正则表达式并应用自定义匹配评估器来获得相同的结果:

var res = Regex.Replace(
    s
,   @"^.*(?=.{2}\@.{2})|(?<=.{2}\@.{2}).*(?=.com.*$)"
,   match => new string('*', match.ToString().Length)
);

正则表达式有两部分:

  • 左边的^.*(?=.{2}\@.{2})匹配除最后两个字符外的用户名部分
  • 右边的 (?<=.{2}\@.{2}).*(?=.com.*$) 匹配域的后缀,直到“.com...”结尾。

Demo.