RegEx基于组的不同替换?

时间:2017-09-04 05:04:28

标签: c# .net regex vb.net

所以我在正则表达方面相对较差,并做了一些练习。

我正在玩一只简单的狗" deobfucator"只查找[dot](dot)[at](at)。不区分大小写,并且在比赛之前或之后带有或没有任何数量的空格。

这是通常的:someemail [AT] domain (dot) com类型的东西。我希望显然把它变成someemail@domain.com

RegEx我已经提出匹配罚款,但现在我想用.@取代匹配。

即。 我希望小组匹配" dot"要用文字.替换它,以及匹配" at"文字@的小组。

我知道我可以写两个不同的(几乎完全相同的)RegEx并通过它们运行它,但为了教育,我试图看看我是否可以在一个RegEx中完成所有操作?

这是我提出的RegEx(可能不是最小的,我也有兴趣看到):

+(\[|\()(dot)(\)|\]) +| +(\[|\()(at)(\)|\]) +

注意:在每个+之前,有一个空格,用于匹配空格。

我正在寻找的是我将用什么来正确地进行替换?

更新:对不起,忘了添加我正在使用的语言。在这种情况下,我使用剪贴板实用程序可以在其输入上运行RegEx(无论是什么被复制到剪贴板),它使用的引擎是C#/ VB。 NET 即可。这个小项目的最终目标是能够复制一个混淆的"#34;电子邮件地址或网址,然后在其上运行RegEx,以便将其设置在剪贴板中,并在其中进行"未经过模糊处理"状态。

尽管如此,我确实倾向于在许多不同语言中使用RegEx,因此在语言之间进行转换通常不是问题。

2 个答案:

答案 0 :(得分:2)

.NET正则表达式不支持条件替换模式。

  

为了教育,我试图看看我是否可以在一个RegEx中完成所有工作?

还有其他正则表达式引擎允许在conditional replacement patterns的单个正则表达式替换操作中使用条件替换逻辑。

有3种引擎支持这种类型的替换:JGsoft V2,Boost和PCRE2。

要使条件在Boost中有效,您需要将regex_constants::format_all传递给regex_replace。要让他们在PCRE2中工作,您需要将PCRE2_SUBSTITUTE_EXTENDED传递给pcre2_substitute

在PCRE2中:

  

${1:+matched:unmatched}其中1是1到99之间的数字,引用编号的捕获组。如果您的正则表达式包含命名捕获组,那么您可以通过其名称${name:+matched:unmatched}在条件中引用它们。

     

如果你想在匹配的部分中使用文字冒号,那么你需要用反斜杠转义它。如果你想在条件中的任何地方使用文字结束大括号,那么你需要用反斜杠转义它。除了启动条件的:+之外,加号没有特殊含义,因此它们不需要被转义。

另请参阅The Boost-Specific Format Sequences

  

format_all标记指定为regex_replace()时,识别的转义序列与format_perl的转义序列相同。此外,还会识别以下形式的条件表达式:

     

?Ntrue-expression:false-expression

     

其中N是表示子匹配的十进制数字。如果相应的子匹配参与完全匹配,则替换为true-expression。否则,它是假表达。在此模式下,您可以使用parens ()进行分组。如果你想要一个文字paren,你必须将它作为\(转义。

在Boost替换模式中,必须转义文字()

JGsoft V2替换字符串条件的语法与C ++ Boost库中的语法相同。

因此,您的正则表达式可以约定为( +)[[(](?:(dot)|(at))[])]( +)

  • ( +) - 第1组:一个或多个空格
  • [[(] - [(
  • (?:(dot)|(at)) - (第2组)dot子字符串或(第3组)at子字符串
  • [])] - )]
  • ( +) - 第4组:一个或多个空格

并替换为$1(?{3}.:@)$4

  • $1 - 第1组值,
  • (?{3}.:@) - 如果第3组匹配,则使用.替换,使用@替换
  • $4 - 第4组值。

这可以在Notepad ++中找到:

enter image description here

答案 1 :(得分:1)

如果您使用的是Java,请尝试replaceAll课程中的String方法。

最后你需要用空格标准化它:
  - 纯Java - String after = before.trim().replaceAll("\\s+", " ");
  - 纯Java - String after = before.replaceAll("\\s{2,}", " ").trim();
  - Apache commons lang3 - String after = StringUtils.normalizeSpace(String str);
  - ......