为什么Ruby / ] /会错过一些标点字符?

Ruby /[[:punct:]]/应该匹配所有“标点字符”。 根据维基百科的说法,这意味着每个POSIX标准/[\]\[!"#$%&'()*+,./:;?@\^_`{|}~-]/ / [|]。[!] /[\]\[!"#$%&'()*+,./:;?@\^_`{|}~-]/ %&’()* +,。/ /[\]\[!"#$%&'()*+,./:;?@\^_`{|}~-]/ /。

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

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

是什么赋予了?

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

定义要分类为标点字符的字符。 在POSIX语言环境中,不应包括或alpha,digit或cntrl类中的任何字符。 在区域设置定义文件中,不会为关键字upper,lower,alpha,digit,cntrl,xdigit或指定的关键字指定字符。

基本上,它定义了如何通过排除其他字符类来定义punct ,但它实际上并不直接定义标点符号 – 这是区域设置的工作。

我找不到每个语言环境中的规范参考。 也许别人知道。 同时,您可以找到与您想要的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 

一个更好的解决方案是在你的正则表达式中使用’Symbol’类别而不是’punct’类别,它匹配UTF-8编码中的’<':

 2.1.2 :012 > /\p{S}/u =~ '<' => 0 

这里有一个更长的类别列表。