使用&&字符类中的运算符

时间:2013-12-29 13:27:57

标签: javascript ruby regex

这样的东西适用于Ruby,但不能用于Javascript:

str = "now is the time"
p str.gsub(/[a-z&&[^aeiou]]/, '*')

注意第二行的&&

[a-z&&[^aeiou]]有效,但如果您删除整个正则表达式中的[]并且a-z&&[^aeiou]它将无效。为什么?这只是Ruby的独特之处吗?我无法找到有关此功能的更多信息。

2 个答案:

答案 0 :(得分:3)

在正则表达式中&&是字符类交集的运算符。 Ruby的正则表达式引擎称为Oniguruma,这里是文档的摘录(强调添加):

  

角色等级

     

^ ...负类(最低优先级运算符)
    x-y的范围从x到y
    [...] set(字符类中的字符类)
   ..&& ..交叉点(^的下一个低优先级)

至于为什么它在JS中不起作用我不知道,可能是因为有问题的引擎没有实现这个操作符。例如,在Java中,它可以工作。

答案 1 :(得分:2)

  

字符类可能包含另一个字符类。这本身没有用,因为[a-z[0-9]]描述了与[a-z0-9]相同的集合。但是,字符类还支持&&运算符,该运算符对其参数执行集合交集。这两者可以合并如下:

/[a-w&&[^c-g]z]/ # ([a-w] AND ([^c-g] OR z))
     

这相当于:

/[abh-w]/
     

http://www.ruby-doc.org/core-2.1.0/Regexp.html#class-Regexp-label-Character+Classes

此运算符确实在Javascript中不可用。