德尔菲正则表达式中的内部 INSIDE LOOKBACK 中的变量重复?



我假设Delphi的System.RegularExpressions中使用的正则表达式方言是PCRE。(我使用德尔福里约10.3.3(

RegexBuddy给了我一个警告,这个正则表达式(使用PCRE时(:

(?<!('.*)){.*?}

PCRE 库不支持内部变量重复 回头看

这是我尝试匹配的示例数据:

ThisString := ' ab{comment inside a string}yz ';

有没有办法在德尔福里约热内卢 10.3.3 的正则表达式中使用后视中的变量重复?

在 PCRE(以及使用 PCRE 的 Delphi(中,您可以使用K来解决后视的限制。 您问题中的正则表达式可以像这样重写:

(?m)(^|G)[^'v]*?K{.*?}

RegexBuddy 4.10.0完全支持Delphi 10.3。 10.3.0 和 10.3.3 之间的正则表达式支持没有区别。

如果您尝试在 Delphi 中匹配字符串和注释,最好使用单独匹配它们的简单正则表达式。 此正则表达式有 3 个单独的替代项来匹配字符串、注释或备用注释:

(?<string>'[^'v]*+')|(?<comment>{[^}]*+})|(?<altcomment>(?m)(*.*?*))

编写一些 Delphi 代码来迭代此正则表达式的匹配项,并根据 3 个捕获组中的哪一个匹配,将匹配项作为字符串、注释或备用注释进行处理或跳过。

您可以使用(*SKIP)(*FAIL)动词:

'[^']*{[^']*'(*SKIP)(*FAIL)|{.*?}

演示


如果您的正则表达式风格不支持(*SKIP)(*FAIL),您可以使用:

'[^'{}]*{[^'{}]*}[^'{}]*'|({.*?})

并测试组 1 是否存在。

演示和解释

最新更新