Mik*_*eC8 3 ruby regex perl pcre oniguruma
在Perl中,您可以执行以下操作:
(?x)
(?(DEFINE)
(?<animal>dog|cat)
)
(?&animal)
Run Code Online (Sandbox Code Playgroud)
在Ruby(Oniguruma引擎)中,似乎(?(DEFINE...不支持该语法。另外,(?&...成为\g。因此,您可以这样做:
(?x)
(?<animal>dog|cat)
\g<animal>
Run Code Online (Sandbox Code Playgroud)
但是当然,这并不等同于我上面给出的Perl示例,因为第一个(?<animal>dog|cat)不被忽略,因为没有类似的东西(?(DEFINE...。
如果我想用一堆命名子例程定义一个大型正则表达式,那么用Perl我曾经可以做的事情就无法用这种方式完成。
看来我可以通过执行以下操作来破解一个非常尴尬的解决方案:
(?x)
(?:^$DEFINE
(?<animal>dog|cat)
){0}
\g<animal>
Run Code Online (Sandbox Code Playgroud)
但是,这是非常骇人听闻的。有一个更好的方法吗?Oniguruma是否支持定义命名子例程的方法而不必先尝试“匹配”它们?
另外,如果有一种方法可以让真正的PCRE在Ruby中工作?(DEFINE...,(?&...我也会考虑的。
谢谢!
您不需要如此复杂的技巧。写作:
(?x)
(?<animal>dog|cat){0}
(?<color>red|green|blue){0}
...
your main pattern here
Run Code Online (Sandbox Code Playgroud)
完全一样。
将所有组定义放到里面(?:^$DEFINE ... ){0}只是表面上的。
请注意,{0}根本没有尝试使用带有限定符的组(首先考虑了限定符),并且如果以此方式定义了已命名的组,则人可以推断出它实际上不是hack,而是用oniguruma来做。