gpt4 book ai didi

ruby - Ruby 中 `\w` 与 `[[:alpha:]]` 之间 Unicode 行为的差异

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:24 24 4
gpt4 key购买 nike

(本题忽略\w的数字和下划线匹配,与此处讨论无关。)
根据Oniguruma docs ,像 \w 这样的简写字符类和像 [:alpha:] 这样的 POSIX 类在 Unicode 方面都有相似的行为:它们对“非 Unicode 大小写”有简单的 ascii 行为“(我假设这意味着字符串的 encoding 不是 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 究竟做了什么,有人可以链接到记录它的地方吗?)

最佳答案

从 2.0 版开始,Ruby 使用 Onigmo ,一个 Oniguruma 分支,支持在 Perl 5.10 中实现的更多功能。

如果将链接的文档 (Oniguruma) 与 Onigmo's doc 进行比较您可以看到 \w 描述之间的区别:

  • 鬼车:

\w word character

       Not Unicode:
alphanumeric, "_" and multibyte char.

Unicode: General_Category -- (Letter|Mark|Number|Connector_Punctuation)
  • 奥尼格莫:

\w word character

       Not Unicode:
alphanumeric and "_".

Unicode: General_Category -- (Letter|Mark|Number|Connector_Punctuation)

It depends on ONIG_OPTION_ASCII_RANGE option that non-ASCII char includes or not.

如您所见,不再有这个"and multibyte char." 这没有意义(至少对我而言),这可能是一个拼写错误。无论如何,这是非常不清楚的。

u 修饰符将速记字符类从“非 Unicode”(默认)切换为“Unicode”。这就是为什么当您尝试使用字符类 \w 匹配它时,您只获得没有它的 caf 和带有它的 café 的原因。

另一方面,字符类 [[:alpha:]] 似乎已经默认扩展为 unicode 字符,因为它匹配没有 u 修饰符的“café”。可以在文档中找到解释的开始:

It depends on ONIG_OPTION_ASCII_RANGE option and ONIG_OPTION_POSIX_BRACKET_ALL_RANGE option that POSIX brackets match non-ASCII char or not.

但是您可以使用 (?a) 修饰符将其强制为 ascii。

关于ruby - Ruby 中 `\w` 与 `[[:alpha:]]` 之间 Unicode 行为的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50356548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com