使用 RegEx 正确匹配,但无需替换即可工作

Correct match using RegEx but it should work without substitution

我有 <autorpodpis>([^;,<\n\r]*?)\s*[;,<\n\r] 来捕捉里面的所有东西

<autorpodpis>_this_is_an_example_of_what_I'd_like_to_match<
如果冒号或分号前有 space、冒号 (;) 或分号 (;) 或 space,则我的 RegEx 会捕获除包括这些字符——见我的 link。它按预期工作。

总的来说,RegEx 在替换 </code> 时运行良好(或者在 AutoHotKey 中我使用 – <code>)。但我想在不使用替换的情况下进行匹配。

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

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

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

所以,你可以使用

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

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

解释:

  • (?<=<autorpodpis>) - 检查当前测试位置之前是否有 <autorpodpis>。如果有none,本次匹配失败,继续到string
  • 中的下一个位置
  • \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]。我的正则表达式是 linear,每个后续子模式都与前一个不匹配。