除单引号外,我想匹配所有标点符号。
我尝试了以下方法。
/[^'[:punct:]]
取消所有标点符号。[(^')[:punct:]]
似乎完全忽略了^'
。如果没有,我想我总是可以写出:punct:
以外的完整'
。
答案 0 :(得分:6)
这可以通过使用负前瞻来实现:
(?!')[[:punct:]]
答案 1 :(得分:5)
来自Ruby文档:
一个字符类可能包含另一个字符类。就其本身而言,这是没有用的,因为
[a-z[0-9]]
描述的集合与[a-z0-9]
相同。但是,字符类还支持&&
运算符,该运算符对其参数执行相交。
因此,“标点符号而不是撇号”是:
[[:punct:]&&[^']]
编辑:根据有问题的revo的需求,在我的计算机上,该基准测试的速度比预期慢了10%,而对基准的影响却慢了约20%:
require 'benchmark'
N = 1_000_000
STR = "Mr. O'Brien! Please don't go, Mr. O'Brien!"
def test(bm, re)
N.times {
STR.scan(re).size
}
end
Benchmark.bm do |bm|
bm.report("intersection") { test(bm, /[[:punct:]&&[^']]/) }
bm.report("lookahead") { test(bm, /(?!')[[:punct:]]/) }
bm.report("lookbehind") { test(bm, /[[:punct:]](?<!')/) }
end