这个正则表达式模式的C#等效

时间:2018-02-09 16:14:17

标签: c# regex regex-lookarounds regex-group

我有这个正则表达式模式:.{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):在模式中的给定位置强制匹配失败(与(?!)相同

2 个答案:

答案 0 :(得分:3)

试试这个正则表达式:

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

<强> Click for Demo

<强>解释

  • \w - 匹配单词字符
  • (?=.{2,}@) - 积极前瞻以找到位置后立即出现2次以上任何字符后跟@
  • | - 或
  • (?<=@[^\.]{2,}) - 在@之后立即查找前面的位置,然后发现任何不是.
  • 的任何字符的2次出现
  • \w - 匹配单词字符。

将每个匹配替换为*

答案 1 :(得分:2)

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

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

正则表达式有两部分:

  • 左侧的^.*(?=.{2}\@.{2})匹配除最后两个字符之外的用户名部分
  • 右侧(?<=.{2}\@.{2}).*(?=.com.*$)中的一个匹配域的后缀,直到&#34; .com ...&#34;结束。

Demo.