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