在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...
和(?&...
我也会这样做。
谢谢!
答案 0 :(得分:4)
你不需要这么复杂的黑客攻击。写作:
(?x)
(?<animal>dog|cat){0}
(?<color>red|green|blue){0}
...
your main pattern here
完全一样。
将所有组定义放在(?:^$DEFINE ... ){0}
中只是装饰性的。
请注意,量词{0}
的组根本没有“尝试”(首先读取量词)。如果以这种方式命名组被定义,那么人类可以推断出它不是真正的黑客,而是通过oniguruma来实现它。