使用RegEx进行正确匹配,但它应该无需替换

时间:2016-04-06 09:52:32

标签: regex autohotkey

我有<autorpodpis>([^;,<\n\r]*?)\s*[;,<\n\r]来抓住内部的一切

<autorpodpis>_this_is_an_example_of_what_I'd_like_to_match<
如果有空格,冒号(;)或分号(;)或冒号或分号前的空格,我的RegEx会捕获所有内容,但不包括这些字符 - 请参阅我的链接。它按预期工作。

总的来说,RegEx适用于替换\1(或者我使用的AutoHotKey - $1)。但是我喜欢不使用替换的比赛。

1 个答案:

答案 0 :(得分:1)

您似乎混合使用术语替换(基于正则表达式的替换操作)和捕获(存储使用随附的模式的一部分捕获的匹配值的一部分)编号或命名堆栈中的一对未转义的括号。)

如果您只想匹配特定上下文中的子字符串而不捕获任何子值,您可以考虑使用lookarounds(lookbehind或lookahead)。

在您的情况下,由于您需要在某些已知字符串之后匹配字符串,因此您需要 lookbehind 。 lookbehind 告诉正则表达式引擎暂时在字符串中向后退一步,以检查lookbehind内的文本是否可以在那里匹配

所以,你可以使用

pos := RegExMatch(input, "(?<=<autorpodpis>)\p{L}+(?:\s+\p{L}+)*", Res)

因此,如果您提供Res作为输入,WOJCIECH ZAŁUSKA应该有<autorpodpis>WOJCIECH ZAŁUSKA</autorpodpis>

说明:

  • (?<=<autorpodpis>) - 检查当前测试位置之前是否有<autorpodpis>。如果没有,请将此匹配失败,转到字符串
  • 中的下一个位置
  • \p{L}+ - 1+ Unicode字母
  • (?:\s+\p{L}+)* - 0 + 1+个空格的序列,后跟1 + Unicode字母。

然而,在大多数情况下,并且总是在这样的情况下当看后方的模式已知时,后观是未锚定的(例如,当它是模式中的第一个子模式时)并且您不需要重叠匹配,使用捕获

capturing的版本:

pos := RegExMatch(input, "<autorpodpis>(\p{L}+(?:\s+\p{L}+)*)", Res)

然后Res[1]将保留WOJCIECH ZAŁUSKA值。捕获在大多数情况下(96%)更快。

现在,您的正则表达式 - <autorpodpis>([^;,<\n\r]*?)\s*[;,<\n\r] - 效率不高,因为[^;,<\n\r]也匹配\s\s匹配[;,<\n\r]。我的正则表达式是线性,每个后续子模式与前一个子模式不匹配。