正则表达式,如何匹配所有的标点符号,但不匹配单词中间的单引号和连字符? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xhj
V2EX    问与答

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

  •  
  •   xhj 2013-04-24 10:21:27 +08:00 20055 次点击
    这是一个创建于 4557 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求是匹配除了类似于 don’t 中的 ’,以及 red-moon 中的 - 之外的所有中英文标点符号,这个正则表达式该如何写?

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

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

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

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

    另外注意一个问题,’ ' 撇号和单引号不是同一个符号(不是中英符号的区别,撇号确实是单独存在的哦一个东西……当然书里看具体情况,是用的什么号)
    lululau
        14
    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
        15
    lululau  
       2013-04-24 11:21:55 +08:00
    发现还些标点符号不在 0x3000 ~ 0x303F 这个区域。。。
    比如还有:0xFF00 ~ 0xFF61。。。
    ljbha007
        16
    ljbha007  
       2013-04-24 11:46:39 +08:00
    @xhj
    如果还有没考虑到的符号就在第一个方括号里边加就行了

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

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

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

    @lululau 思路和我的差不多,从unicode编码着手,我是准备用 /\p{P}/ 过滤掉所有的中英文标点符号,这样一来,消灭得虽然干净,但撇号和连字符就被枪毙了,这个正则表达式究竟应该怎么写?
    rrfeng
        18
    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
        19
    ljbha007  
       2013-04-24 12:22:47 +08:00
    @xhj 你可以把unicode加到那个方括号里边 我这个主要是后面判断单引号是否是作为引号在使用
    xhj
        20
    xhj  
    OP
       2013-04-24 12:28:40 +08:00
    @ljbha007
    @rrfeng
    @lululau

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

    谢谢各位,结帖。
    关于     帮助文档     自助推广系统     博客   API     FAQ     Solana     1017 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:30 PVG 02:30 LAX 11:30 JFK 14:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86