13

Ruby/[[:punct:]]/应该匹配所有“标点符号”。根据Wikipedia,这意味着/[\]\[!"#$%&'()*+,./:;<=>?@\^_`{|}~-]/每个 POSIX 标准。

它匹配:-[]\;',./!@#%&*()_{}::"?.

但是,它不匹配:(=`~$^+|<>至少在 ruby​​ 1.9.3p194 中)。

是什么赋予了?

4

2 回答 2

11

标点符号类由语言环境定义。punct的 Open Group LC_TYPE 定义说:

定义要分类为标点字符的字符。在 POSIX 语言环境中,<space>不应包含 alpha、digit 或 cntrl 类中的 the 或任何字符。在语言环境定义文件中,不应为关键字upper、lower、alpha、digit、cntrl、xdigit 或as 指定任何字符。

基本上,它定义了如何通过排除其他字符类来定义punct ,但它实际上并没有直接定义标点符号——这是语言环境的工作。

我找不到每个语言环境中内容的规范参考。也许别人知道。同时,您可以找到与您想要的点字符类匹配的 LC_TYPE 或者直接指定类。

于 2012-06-21T01:53:48.620 回答
2

大于符号属于“符号,数学”类别,而不是标点符号类别。如果您将正则表达式的编码强制为 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 

这里有更长的类别列表。

于 2014-09-17T12:39:58.317 回答