gpt4 book ai didi

regex - 正则表达式匹配

转载 作者:行者123 更新时间:2023-12-03 18:08:34 25 4
gpt4 key购买 nike

我想写一个正则表达式来匹配之间的任何东西

()
(())
(()())
((()))
()()()

等等。

最佳答案

所有这些声称您不能使用模式来匹配具有平衡嵌套括号的字符串的答案都是非常错误的。假设现代编程语言匹配的模式仅限于病态教科书意义上的“常规语言”是不切实际的。一旦您允许反向引用,它们就不会。这使得现实世界的模式比教科书版本更匹配,使它们更加实用。

匹配平衡括号的最简单模式是 \((?:[^()]*+|(?0))*\) .但是你永远不应该写那个,因为它太紧凑而不容易阅读。你应该总是用 /x 写它模式以允许空格和注释。所以写成这样:

m{
\( # literal open paren
(?: # begin alternation group
[^()]*+ # match nonparens possessively
| # or else
(?0) # recursively match entire pattern
)* # repeat alternation group
\) # literal close paren
}x

关于命名抽象,以及将它们的定义和顺序与它们的执行解耦,还有很多话要说。这导致了这种事情:
my $nested_paren_rx = qr{

(?&nested_parens)

(?(DEFINE)

(?<open> \( )
(?<close> \) )
(?<nonparens> [^()] )

(?<nested_parens>
(?&open)
(?:
(?&nonparens) *+
|
(?&nested_parens)
) *
(?&close)
)

)
}x;

第二种形式现在可以包含在更大的模式中。

永远不要让任何人告诉您不能使用模式来匹配递归定义的内容。正如我刚刚演示的那样,你当然可以。

当你在做的时候,确保永远不要写线噪声模式。你没有必要,也不应该。禁止使用空格、注释、子例程或字母数字标识符的编程语言是不可维护的。所以在你的模式中使用所有这些东西。

当然,为此类工作选择正确的语言确实有帮助。 ☺

关于regex - 正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4031112/

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