Ruby/[[:punct:]]/
应该匹配所有“标点符号”。根据Wikipedia,这意味着/[\]\[!"#$%&'()*+,./:;<=>?@\^_`{|}~-]/
每个 POSIX 标准。
它匹配:-[]\;',./!@#%&*()_{}::"?
.
但是,它不匹配:(=`~$^+|<>
至少在 ruby 1.9.3p194 中)。
是什么赋予了?
标点符号类由语言环境定义。punct的 Open Group LC_TYPE 定义说:
定义要分类为标点字符的字符。在 POSIX 语言环境中,
<space>
不应包含 alpha、digit 或 cntrl 类中的 the 或任何字符。在语言环境定义文件中,不应为关键字upper、lower、alpha、digit、cntrl、xdigit 或as 指定任何字符。
基本上,它定义了如何通过排除其他字符类来定义punct ,但它实际上并没有直接定义标点符号——这是语言环境的工作。
我找不到每个语言环境中内容的规范参考。也许别人知道。同时,您可以找到与您想要的点字符类匹配的 LC_TYPE ,或者直接指定类。
大于符号属于“符号,数学”类别,而不是标点符号类别。如果您将正则表达式的编码强制为 UTF-8(它默认为源编码,并且可能您的源是 UTF-8 编码,而我的默认源是其他东西),您可以看到这一点:
2.1.2 :004 > /[[:punct:]]/u =~ '<'
=> nil
2.1.2 :005 > /[[:punct:]]/ =~ '<'
=> 0
如果您将正则表达式强制为 ASCII 编码(/n -此处有更多选项),您会看到它在 punct 中对 '<' 进行分类,我认为这正是您想要的。但是,如果您的源包含 UTF-8 的 ASCII 子集之外的字符,这可能会导致问题。
2.1.2 :009 > /[[:punct:]]/n =~ '<'
=> 0
更好的解决方案是在您的正则表达式中使用“符号”类别而不是“punct”类别,它与 UTF-8 编码中的“<”匹配:
2.1.2 :012 > /\p{S}/u =~ '<'
=> 0
这里有更长的类别列表。