Delphi 正则表达式中 INSIDE LOOKBEHIND 内的变量重复?
Variable repetition inside INSIDE LOOKBEHIND in Delphi Regular Expression?
我假设 Delphi 的 System.RegularExpressions 中使用的 Regex 方言是 PCRE。 (我用的是DelphiRio 10.3.3)
RegexBuddy 使用此正则表达式(使用 PCRE 时)向我发出警告:
(?<!('.*))\{.*?\}
The PCRE library does not support variable repetition inside
lookbehind
这是我要匹配的示例数据:
ThisString := ' ab{comment inside a string}yz ';
在 Delphi Rio 10.3.3 的正则表达式中,有没有什么方法可以在 lookbehind 中使用变量重复?
您可以使用 (*SKIP)(*FAIL)
动词:
'[^']*{[^']*'(*SKIP)(*FAIL)|{.*?}
如果您的正则表达式风格不支持 (*SKIP)(*FAIL)
,您可以使用:
'[^'{}]*{[^'{}]*}[^'{}]*'|({.*?})
并测试第 1 组是否存在。
在 PCRE 中(以及在使用 PCRE 的 Delphi 中)您可以使用 \K
来绕过 lookbehind 的限制。您问题中的正则表达式可以这样重写:
(?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 个捕获组中的哪一个将匹配项作为字符串、注释或备用注释进行处理或跳过。
我假设 Delphi 的 System.RegularExpressions 中使用的 Regex 方言是 PCRE。 (我用的是DelphiRio 10.3.3)
RegexBuddy 使用此正则表达式(使用 PCRE 时)向我发出警告:
(?<!('.*))\{.*?\}
The PCRE library does not support variable repetition inside lookbehind
这是我要匹配的示例数据:
ThisString := ' ab{comment inside a string}yz ';
在 Delphi Rio 10.3.3 的正则表达式中,有没有什么方法可以在 lookbehind 中使用变量重复?
您可以使用 (*SKIP)(*FAIL)
动词:
'[^']*{[^']*'(*SKIP)(*FAIL)|{.*?}
如果您的正则表达式风格不支持 (*SKIP)(*FAIL)
,您可以使用:
'[^'{}]*{[^'{}]*}[^'{}]*'|({.*?})
并测试第 1 组是否存在。
在 PCRE 中(以及在使用 PCRE 的 Delphi 中)您可以使用 \K
来绕过 lookbehind 的限制。您问题中的正则表达式可以这样重写:
(?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 个捕获组中的哪一个将匹配项作为字符串、注释或备用注释进行处理或跳过。