首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命名子程序在Oniguruma regex引擎?

命名子程序在Oniguruma regex引擎?
EN

Stack Overflow用户
提问于 2015-10-31 08:09:04
回答 1查看 170关注 0票数 3

在Perl中,您可以这样做:

代码语言:javascript
复制
(?x)
(?(DEFINE)
  (?<animal>dog|cat)
)
(?&animal)

在Ruby (Oniguruma )中,似乎不支持(?(DEFINE...语法。另外,(?&...变成了\g。所以,你可以这样做:

代码语言:javascript
复制
(?x)
(?<animal>dog|cat)
\g<animal>

但是当然,这并不等同于我前面给出的Perl示例,因为第一个(?<animal>dog|cat)不会被忽略,因为没有任何类似于(?(DEFINE...的东西。

如果我想用一堆命名的子例程来定义一个大型正则表达式,那么我在Perl中可以做的事情就不能这样做。

实际上,我似乎可以通过这样的操作来破解一个非常尴尬的解决方案:

代码语言:javascript
复制
(?x)
(?:^$DEFINE
  (?<animal>dog|cat)
){0}
\g<animal>

但是,这还真是太麻烦了。有更好的方法吗?Oniguruma是否支持一种定义命名子例程的方法,而不必先尝试“匹配”它们?

或者,如果有一种方法可以在Ruby中实现真正的PCRE,使用?(DEFINE...(?&...,我也会这么做。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-31 13:23:12

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

代码语言:javascript
复制
(?x)
(?<animal>dog|cat){0}
(?<color>red|green|blue){0}
...
your main pattern here

做同样的事。

(?:^$DEFINE ... ){0}中放置所有组定义只是表面的。

注意,一个带有量词{0}的组根本不尝试(首先考虑量词),如果以这种方式定义了指定的组,那么man可以推断它不是真正的黑客,而是使用oniguruma的方法。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33449467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档