为什么Ruby/[[:punct:][]/漏掉了一些标点符号?

为什么Ruby/[[:punct:][]/漏掉了一些标点符号?,ruby,regex,posix,Ruby,Regex,Posix,Ruby/[:punct:]/应该匹配所有的“标点符号”。根据POSIX标准,这意味着/[\]\[!“\$%&'()*+,./:;?@^^{{124;}-]/ 它匹配:-[]\;',./!@\\%&*()::“? 但是,它不匹配:=`~$^+|(至少在ruby 1.9.3p194中是如此) 给出了什么?标点符号字符类由语言环境定义。开放组织说: 定义要分类为标点符号的字符。在POSIX语言环境中,既不包括,也不包括alpha、digit或cntrl类中的任何字符。在区域设置定义文件中,不应为关键

Ruby
/[:punct:]/
应该匹配所有的“标点符号”。根据POSIX标准,这意味着
/[\]\[!“\$%&'()*+,./:;?@^^{{124;}-]/

它匹配:
-[]\;',./!@\\%&*()::“?

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


给出了什么?

标点符号字符类由语言环境定义。开放组织说:

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

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


我找不到每个区域设置中的规范引用。也许其他人知道。同时,您可以找到与所需的点状字符类匹配的LC_类型,或者直接指定该类。

大于符号位于,而不是标点符号类别。如果将正则表达式的编码强制为UTF-8,您可以看到这一点(它默认为源代码编码,并且您的源代码可能是UTF-8编码的,而我的默认源代码是其他代码):


2.1.2:004>/[:punct:]/u=~'/[:punct:]/n=~'我的glibc文档说
[:punct:]
应该匹配任何调用标点符号的东西;
ispunt(3)
页面显示
检查是否有任何非空格或字母数字字符的可打印字符。
。这似乎很明确有关于
punct
类的Unicode大小写和非Unicode大小写的文档。我仍然不确定这具体意味着什么,但我希望这能有所帮助。FWIW,我的语言环境是Rails的默认
en
(非Rails的普通irb也是如此,我的操作系统是
en_US
)。有没有关于如何解决这个问题的建议?我希望没有更多的随机陷阱…符号不包括实际的标点符号,如
,:“
。这两个符号的组合包括所有的“标点符号”字符(由POSIX定义)在ASCII范围内。但是,如果我们使用符号和标点符号的组合,货币符号、版权符号、箭头和各种其他符号也将包括在通用类别中。
2.1.2 :004 > /[[:punct:]]/u =~ '<'
 => nil 
2.1.2 :005 > /[[:punct:]]/ =~ '<'
 => 0 
2.1.2 :009 > /[[:punct:]]/n =~ '<'
 => 0 
2.1.2 :012 > /\p{S}/u =~ '<'
 => 0