gpt4 book ai didi

regex - Tcl 正则表达式 : Help Needed on non-greedy quantifiers in pattern with '(' , ')' 个字符

转载 作者:行者123 更新时间:2023-12-02 05:35:26 26 4
gpt4 key购买 nike

我有这样的模式:substring1(substring2),(xxxx)xxxx需要 substring1(第一个括号之前的字符串)和 substring2(第一个括号内的字符串),这没问题。此外,需要一个子字符串中第一个括号后的所有字符——这些字符本身可能就是括号。因此使用模式 - regexp {(.*?)\((.*?)\)(.*)} $a match sub1 sub2 sub3但是最后一个子串不能收集到sub3中。请帮助我!

> 247 % set a substring1(substring2),(xxxx)xxxx
> 248 % regexp {(.*?)\((.*?)\)(.*)} $a match sub1 sub2 sub3 1
> 249 % puts $sub1; puts $sub2; puts $sub3
substring1
substring2

> 250 %

最佳答案

你遇到的问题是 Tcl 的 RE 引擎是自动机理论的,不能很好地处理切换贪婪模式。特别地,对于一阶近似,字符串中的第一个量词设置整个 RE 的贪婪度。 (这实际上不是真的,但它何时切换的规则非常神秘。)

如果你没有嵌套括号,你可以使用这个:

regexp {^([^()]*)\(([^()]*)\)(.*)$} $a match sub1 sub2 sub3

测试(省略了明显的位):

% puts $sub1|$sub2|$sub3
substring1|substring2|,(xxxx)xxxx

处理嵌套括号要困难得多。问题是任意嵌套是你不再处理一种可以由有限自动机正式匹配的“语言”的地方(相反你需要一个下推自动机,这是一个不同的可判定性类)。对于有限级别的嵌套,您可以对其进行编码;这是在一个级别上执行此操作的方法:

regexp {^([^(]*)\(((?:[^()]|\([^()]*\))*)\)(.*)$} $a match sub1 sub2 sub3

也就是说,我用(?:[^()]|\([^()]*\))替换了[^()]。您可以通过再次替换第二个 sub-[^()] 来轻松地更深入,只要您愿意。然而,这使得 RE 更加复杂(这实际上是问题所在;任意嵌套的 paren 匹配器将需要无限长的 RE)。如果你正在处理那个特定的问题,尝试找到一些其他技术会更容易(例如,一个更长的“ block 结束”字符串来匹配像 ), - 用逗号 - 或者使用递归解析器)。

关于regex - Tcl 正则表达式 : Help Needed on non-greedy quantifiers in pattern with '(' , ')' 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11771610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com