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

时间:2015-10-31 08:09:04

标签: ruby regex perl pcre oniguruma

在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...(?&...我也会这样做。

谢谢!

1 个答案:

答案 0 :(得分:4)

你不需要这么复杂的黑客攻击。写作:

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

完全一样。

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

请注意,量词{0}的组根本没有“尝试”(首先读取量词)。如果以这种方式命名组被定义,那么人类可以推断出它不是真正的黑客,而是通过oniguruma来实现它。