gpt4 book ai didi

ruby - Oniguruma 正则表达式引擎中的命名子程序?

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:12 24 4
gpt4 key购买 nike

在 Perl 中,您可以这样做:

(?x)
(?(DEFINE)
(?<animal>dog|cat)
)
(?&animal)

在 Ruby(Oniguruma 引擎)中,似乎 (?(DEFINE...不支持语法。另外,(?&...变成 \g .所以,你可以这样做:

(?x)
(?<animal>dog|cat)
\g<animal>

当然,这不等同于我上面给出的 Perl 示例,因为第一个 (?<animal>dog|cat)不会被忽略,因为没有类似 (?(DEFINE... 的东西.

如果我想用一堆命名子程序定义一个大型正则表达式,我以前可以用 Perl 做的事情就不能用这种方法来完成。

看起来我确实可以通过做这样的事情来拼凑一个非常尴尬的解决方案:

(?x)
(?:^$DEFINE
(?<animal>dog|cat)
){0}
\g<animal>

但是,那是相当骇人听闻的。有一个更好的方法吗? Oniguruma 是否支持定义命名子例程而不必先尝试“匹配”它们的方法?

或者,如果有办法让真正的 PCRE 在 Ruby 中工作,使用 ?(DEFINE...(?&...我也会接受。

谢谢!

最佳答案

您不需要这么复杂的技巧。写作:

(?x)
(?<animal>dog|cat){0}
(?<color>red|green|blue){0}
...
your main pattern here

完全一样。

将所有组定义放在 (?:^$DEFINE ... ){0} 中只是装饰性的。

请注意,根本没有尝试使用量词 {0} 的组(首先考虑量词),如果以这种方式定义了命名组,那么人们可以推断这并不是真正的 hack,而是使用 oniguruma 的方法。

关于ruby - Oniguruma 正则表达式引擎中的命名子程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33449467/

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