所以我在正则表达方面相对较差,并做了一些练习。
我正在玩一只简单的狗" 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,因此在语言之间进行转换通常不是问题。
答案 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 ++中找到:
答案 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);
- ......