xhj
V2EX  ›  问与答

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

  •  
  •   xhj · Apr 24, 2013 · 20891 views
    This topic created in 4953 days ago, the information mentioned may be changed or developed.
    需求是匹配除了类似于 don’t 中的 ’,以及 red-moon 中的 - 之外的所有中英文标点符号,这个正则表达式该如何写?

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

    用javascript测试成功
    ljbha007
    ljbha007
    Apr 24, 2013❤️1
    6
    @xhj
    发现写了个没用的 简化了一下

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

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

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

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

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

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

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

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

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

    谢谢各位,结帖。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   942 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 102ms · UTC 19:10 · PVG 03:10 · LAX 11:10 · JFK 14:10
    ♥ Do have faith in what you're doing.