【发布时间】:2011-10-23 08:17:24
【问题描述】:
根据the Oniguruma documentation,\d字符类型匹配:
十进制字符
Unicode:General_Category -- Decimal_Number
但是,在包含所有 Decimal_Number 字符的字符串中扫描 \d 会导致仅匹配拉丁文 0-9 位:
#encoding: utf-8
require 'open-uri'
html = open("http://www.fileformat.info/info/unicode/category/Nd/list.htm").read
digits = html.scan(/U\+([\da-f]{4})/i).flatten.map{ |s| s.to_i(16) }.pack('U*')
puts digits.encoding, digits
#=> UTF-8
#=> 0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९০১২৩৪৫৬৭৮৯੦੧੨…
p RUBY_DESCRIPTION, digits.scan(/\d/)
#=> "ruby 1.9.2p180 (2011-02-18) [i386-mingw32]"
#=> ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
我是否误读了文档?为什么\d 不匹配其他 Unicode 数字,和/或有办法让它匹配?
【问题讨论】:
-
是的,Ruby 正则表达式在 Unicode 方面有很多非常烦人的问题。请参阅我最近的 OSCON Unicode Support Shootout 演讲中关于 Ruby 的幻灯片 15-20,尤其是最后一张。另一方面,它确实进行了完全折叠,这是除了 Perl 之外唯一这样做的引擎。但是由于 Ruby 不满足 UTS#18’s Level 1 conformance requirements 的最基本的 Unicode 正则表达式功能,所以你很不走运。恐怕你需要使用 ICU 或 Perl 来完成真正的 Unicode 工作。
标签: ruby regex unicode character-properties