这样的东西适用于Ruby,但不能用于Javascript:
str = "now is the time"
p str.gsub(/[a-z&&[^aeiou]]/, '*')
注意第二行的&&
。
[a-z&&[^aeiou]]
有效,但如果您删除整个正则表达式中的[]
并且a-z&&[^aeiou]
它将无效。为什么?这只是Ruby的独特之处吗?我无法找到有关此功能的更多信息。
答案 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中不可用。