正则表达式,如何匹配所有的标点符号,但不匹配单词中间的单引号和连字符?

2013-04-24 10:21:27 +08:00
 xhj
需求是匹配除了类似于 don’t 中的 ’,以及 red-moon 中的 - 之外的所有中英文标点符号,这个正则表达式该如何写?

求指点,谢谢!
19740 次点击
所在节点    问与答
20 条回复
ljbha007
2013-04-24 10:27:34 +08:00
百分号呢
ljbha007
2013-04-24 10:27:50 +08:00
还有@呢?
xhj
2013-04-24 10:29:12 +08:00
@libha007 %和@都不用管,我要处理的是文学作品,没得那些玩意儿
rrfeng
2013-04-24 10:37:09 +08:00
枚举出来,写进[]里。
ljbha007
2013-04-24 10:39:33 +08:00
/([\[\]\,.?"\(\)+_*\/\\&\$#^@!~`]|(?!\s)'\s+|\s+'(?!\s)|(?!\s)"\s+|\s+"(?!\s))/

用javascript测试成功
ljbha007
2013-04-24 10:42:30 +08:00
@xhj
发现写了个没用的 简化了一下

http://gist.github.com/5449203
lfocy
2013-04-24 10:55:30 +08:00
/\b[^'-]\b/gmi
mrbrooks
2013-04-24 10:55:50 +08:00
@ljbha007 这个太长了,头晕那
ljbha007
2013-04-24 10:56:28 +08:00
@xhj 加上了中文标点 你刷新一下
xhj
2013-04-24 10:57:02 +08:00
@libha007 诸多符号 比如英文的 “”‘’… 之类的表示无压力

@rrfeng 全枚举出来那得多长呢?并且有些符号列进去没效果
xhj
2013-04-24 10:58:51 +08:00
@libha007 先谢再试
lululau
2013-04-24 11:12:53 +08:00
CJK 标点的 Unicode 代码范围: 0x3000 ~ 0x303F ,不知能是否符合所谓“中文标点”的需求。。。
rrfeng
2013-04-24 11:16:19 +08:00
@xhj 要么就 ![汉字编码范围’-]

另外注意一个问题,’ ' 撇号和单引号不是同一个符号(不是中英符号的区别,撇号确实是单独存在的哦一个东西……当然书里看具体情况,是用的什么号)
lululau
2013-04-24 11:17:45 +08:00
perl -e 'print pack("c*", 0x30, $_) for (0 .. 0x3F); print "\x00\n"' | iconv -f UTF-16BE

其实需要你的需求方先给出所谓“中文标点符号”的定义
lululau
2013-04-24 11:21:55 +08:00
发现还些标点符号不在 0x3000 ~ 0x303F 这个区域。。。
比如还有:0xFF00 ~ 0xFF61。。。
ljbha007
2013-04-24 11:46:39 +08:00
@xhj
如果还有没考虑到的符号就在第一个方括号里边加就行了

我主要是考虑了“将作为引号使用时的单引号选中”的问题
xhj
2013-04-24 11:50:18 +08:00
@lfocy \b是指单词边界,而不是指边界字符

@ljbha007 你这个写法难以应付众多的符号

@rrfeng 我文盲了,嗯,那个应该叫撇号,也是英文中的反引号啊,不过?

@lululau 思路和我的差不多,从unicode编码着手,我是准备用 /\p{P}/ 过滤掉所有的中英文标点符号,这样一来,消灭得虽然干净,但撇号和连字符就被枪毙了,这个正则表达式究竟应该怎么写?
rrfeng
2013-04-24 11:56:49 +08:00
/\p{P}/&&!/-|'/ 不知道php支持这种写法不。
http://zh.wikipedia.org/wiki/%E6%92%87%E5%8F%B7
@xhj
ljbha007
2013-04-24 12:22:47 +08:00
@xhj 你可以把unicode加到那个方括号里边 我这个主要是后面判断单引号是否是作为引号在使用
xhj
2013-04-24 12:28:40 +08:00
@ljbha007
@rrfeng
@lululau

在ruby-china上,@luikore 给我回复了,我按照他的指点,用 /[^-’[^\p{P}]]|’$|’”$/ 解决了。

谢谢各位,结帖。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/66796

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX