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

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...(?&...我也会考虑的。

谢谢!

Cas*_*yte 5

您不需要如此复杂的技巧。写作:

(?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来做。

  • 好的答案,但是我要补充一点,“化妆品”形式应该简单地是((?:...){0}`。“ ^ $ DEFINE”部分没有任何作用,如果设置了变量“ $ DEFINE”,则其值可能会破坏正则表达式。如您所说,“ {0}”提供了必要的功能。分组只是一种方便。 (2认同)