【发布时间】:2018-10-25 15:53:23
【问题描述】:
(对于这个问题,忽略\w的数字和下划线匹配,与这里的讨论无关。)
根据Oniguruma docs,像\w 这样的速记字符类和像[:alpha:] 这样的POSIX 类在Unicode 方面具有相似的行为:它们对于“非Unicode 大小写”具有简单的ascii 行为(我假设这意味着字符串的@ 987654327@ 不是 Unicode 的),并且是一种将 Unicode 属性用于“Unicode Case”的不同行为。
从该文档中,听起来好像其中一个使用 Unicode 属性,另一个也将使用它们。然而,在实践中它们似乎有所不同:POSIX 类自动使用 Unicode 属性,而 \w 类型类必须显式标记为 ?u 才能使用基于 Unicode 属性的匹配:
$ ruby -e 'print("~café.".encoding)'
UTF-8
$ ruby -e 'print(/[[:alpha:]]+/.match("~café."))'
café
$ ruby -e 'print(/\w+/.match("~café."))'
caf
$ ruby -e 'print(/(?u)\w+/.match("~café."))'
café
$ ruby -v
ruby 2.3.6p384
这是一个错误,还是我对文档的解释有误? (?u 到底做了什么,有人可以链接到它的记录位置吗?)
【问题讨论】:
-
Ruby 的
RegExp不一定与 Oniguruma 相同。 Ruby 文档确实说\w是 ASCII 而[[:alpha]]是 Unicode 感知的。不过,似乎两人都没有对(?u)说任何话。我倾向于使用\w,\s,......如果我特别想要ASCII-ish行为,否则\p{...}。 -
u实际上被描述为in the Ruby docs。 -
@WiktorStribiżew 尾随
u与(?u)不同:/\w+/u.match("~café.") # => #<MatchData "caf">