我有<autorpodpis>([^;,<\n\r]*?)\s*[;,<\n\r]
来抓住内部的一切
<autorpodpis>_this_is_an_example_of_what_I'd_like_to_match<
如果有空格,冒号(;)或分号(;)或冒号或分号前的空格,我的RegEx会捕获所有内容,但不包括这些字符 - 请参阅我的链接。它按预期工作。
总的来说,RegEx适用于替换\1
(或者我使用的AutoHotKey - $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]
。我的正则表达式是线性,每个后续子模式与前一个子模式不匹配。