几十年以来,一直都对正则表达式一塌糊涂的,现在紧急求助:
如何过滤掉字符串中的所有标点符号,但不得过滤类似于 don’t 这种单词中间的单引号?
现在一点思路都没有,求指点,求提示,谢谢!
另,/\p{P}/ 为什么无法过滤掉 “”‘’ 这四个引号?
/\p{P}/
“”‘’
![“”‘’],是不是有这个,记不清,从来没记清楚过,看来不是编程的料啊。
@chenge Ruby 的正则表达式好像只能处理 ASCII 码,在表达式中直接写入非 ASCII 字符好像会被忽略的,好像是这样,不确定……
是不是可以先替换成英文的,再过滤呢
@chenge 晕死,“”‘’ 本来就是英文的,你确定知道我问题在哪儿吗?
我是要匹配所有的标点符号,包括中英文,但不匹配 don't 或 don’t 中的 ' 或 ’,求高手指点。
don't
don’t
'
’
#4 楼 @xhj6
如果 /\p{P}/ 不匹配 “”‘’ , 那就是因为你在用的 Ruby 太古老了 如果不能写 unicode 字符,那也是因为你在用的 Ruby 太古老了 赶紧升级吧... ruby 1.9 或者 ruby 2.0 都可以。1.8 很难匹配非 ascii 字符
如果仅仅是匹配中英标点但不匹配 ' 和 ’
方法 1: 运用正则技巧之 double negation:
/[^'’[^\p{P}]]/
方法 2: 如果方法 1 不管用,是因为正则引擎比较老,但还可以运用正则技巧之 negative lookahead 解决:
/(?!['’])\p{P}/
如果还要去掉除了 n't 的结构外的所有 '’, 就要改改代码了
n't
'’
'‘I don’t know’, he said.'.gsub(/(n['’]t\b)|\p{P}/, '\1') # => "I don’t know he said"
代码解释:
\1
@luikore 眼泪哗哗的,万分感谢,这完全是手把手的教啊!我看我真应该下定决心来认真学下正则了,google 的时间成本已经比学习成本多多了
我没改代码,直接用 /[^-’[^\p{P}]]|’$|’”$/ 对付了,暂时能用,关键是您说的双重否定太重要了,完全是茅塞顿开啊
/[^-’[^\p{P}]]|’$|’”$/