3

在 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...(?&...也会接受。

谢谢!

4

1 回答 1

6

你不需要这么复杂的hack。写作:

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

完全一样。

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

请注意,{0}根本没有尝试使用带有量词的组(首先考虑量词),如果无论如何以这种方式定义了命名组,人们可以推断它并不是真正的黑客,而是方式用 oniguruma 来做。

于 2015-10-31T13:23:12.763 回答