除某些字符外,我该如何匹配`:punct:`?

时间:2018-12-03 05:02:47

标签: ruby regex

除单引号外,我想匹配所有标点符号。

我尝试了以下方法。

  • /[^'[:punct:]]取消所有标点符号。
  • [(^')[:punct:]]似乎完全忽略了^'

如果没有,我想我总是可以写出:punct:以外的完整'

2 个答案:

答案 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