在 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>
但是,这很hackish。有一个更好的方法吗? Oniguruma 是否支持定义命名子例程而不必先尝试“匹配”它们的方法?
或者,如果有一种方法可以让真正的 PCRE 在 Ruby 中工作,使用
?(DEFINE...
和 (?&...
我也会这样做。谢谢!
最佳答案
你不需要这么复杂的黑客。写作:
(?x)
(?<animal>dog|cat){0}
(?<color>red|green|blue){0}
...
your main pattern here
完全一样。
将所有组定义放在
(?:^$DEFINE ... ){0}
中只是装饰性的。请注意,根本没有尝试使用量词
{0}
的组(首先考虑量词),并且如果以这种方式定义了命名组,则人们可以推断出它不是真正的黑客,但是用 oniguruma 做到这一点的方法。关于ruby - Oniguruma 正则表达式引擎中的命名子程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33449467/