此正则表达式模式的 C# 等效项

Posted

技术标签:

【中文标题】此正则表达式模式的 C# 等效项【英文标题】:C# equivalent for this regex pattern 【发布时间】:2018-07-20 11:08:18 【问题描述】:

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

【问题讨论】:

正如您所观察到的,它们不是有效的 C# 东西,您可能想解释它们的作用。你会看到大多数 c# 人在看这个问题,他们不知道他们在做什么...... 我只是更新了模式并为 *SKIP 添加了一个细节 你也可以看看nuget.org/packages/PCRE.NET 你可能不知道这一点,但是当.2\@.2\K 匹配某些东西时,替换的结果是在当前位置刚刚过去注入一个星号。这并不代表我所知道的任何掩蔽,因为您添加了一个以前不存在的角色。 另外,这个 .2\@.2\K 部分将匹配点字符。您需要进行更改以防止这种情况发生。此外,如果做一个简单的替换,当使用这个术语 .(?=.*\.) 时,你将无法获得这个术语 .2\@.2\K 的等价物。您必须使用委托回调。因此,通过删除 \K(*SKIP)(?!) 并添加捕获组,您将知道要替换什么以及跳过什么。 【参考方案1】:

试试这个正则表达式:

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

Click for Demo

说明:

\w - 匹配一个单词字符 (?=.2,@) - 正向超前查找位置,紧随其后的任何字符出现 2 次以上,然后是 @ | - 或 (?&lt;=@[^\.]2,) - 正向向后查找以查找紧跟在 @ 前面的位置,然后是出现 2 次以上非 . 的任何字符 \w - 匹配一个单词字符。

*替换每个匹配项

【讨论】:

ai@PP.emodomain.com 没有被屏蔽。 @sln 是的,它不会掩盖任何东西。查看他的原始正则表达式,他似乎不希望 @ 之前的 2 个字符和 @ 之后的 2 个字符被屏蔽。因此,这样的解决方案 是的。此外,您的 sol'n 没有解决这个.2\@.2\K,他使用它来插入一个*,而不是替换。我希望人们乘坐火车到正确的车站,而不是靠近目的地的车站。【参考方案2】:

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

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

正则表达式有两部分:

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

Demo.

【讨论】:

以上是关于此正则表达式模式的 C# 等效项的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式获取 C# 中模式的所有可能匹配项

正则表达式 '\b' 的 T-SQL 等效项

C# 正则表达式 - 为括号内的单个模式查找一个或多个匹配项

在 C# 中获取等效的正则表达式以切断前导和尾随子字符串

正则表达式:如何访问一个组的多个匹配项? [复制]

是否有 Python 等效于正则表达式的 Perl "/x" 修饰符?