在Perl中,你可以这样做:
在 Ruby(Oniguruma 引擎)中似乎不支持
当然,这与我上面提到的Perl示例不等价,因为第一个
如果我想定义一个带有大量命名子程序的大型正则表达式,我曾经在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...
和(?&...
,我也会选择这种方法。
谢谢!
(?: ... ){0}
。^$DEFINE
部分没有任何作用,如果变量$DEFINE
已经被设置,它的值可能会破坏正则表达式。正如你所说,{0}
提供了基本的功能;分组只是方便之举。 - Alan Moore