如何在 ruby​​ 中使用 utf8 的正则表达式

Posted

技术标签:

【中文标题】如何在 ruby​​ 中使用 utf8 的正则表达式【英文标题】:How to use regex for utf8 in ruby 【发布时间】:2010-09-20 09:16:40 【问题描述】:

在 RoR 中,如何验证带有 utf8 代码的发布表单的中文或日文单词。

在GBK代码中,它使用[\u4e00-\u9fa5]+来验证中文单词。 在 php 中,它使用 /^[\x4e00-\x9fa5]+$/u 来处理 utf-8 页面。

【问题讨论】:

【参考方案1】:

Ruby 1.8 对 UTF-8 字符串的支持很差。您需要在正则表达式中单独写入字节,而不是完整的代码:

>> "acentuação".scan(/\xC3\xA7/)
=> ["ç"]    

要匹配你指定的范围,表达式会变得有点复杂:

/([\x4E-\x9E][\x00-\xFF])|(\x9F[\x00-\xA5])/  # (untested)

That will be improved in Ruby 1.9,不过。

编辑: 如 cmets 中所述,unicode 字符 \u4E00-\u9FA5 仅映射到 UTF16-BE 编码中的上述表达式。 UTF8 编码可能不同。所以你需要仔细分析映射,看看你能不能想出一个 Ruby 1.8 的字节匹配表达式。

【讨论】:

在使用 8 位正则表达式引擎(例如 Ruby 1.8 中的引擎)处理 UTF-8 文本时,您标记为“未测试”的正则表达式肯定不等同于 [\u4e00-\u9FA5]。您的正则表达式仅在使用 8 位正则表达式引擎处理 UTF-16BE 文本时才有效。【参考方案2】:

这就是我所做的:

%r^[#"\344\270\200"-#"\351\277\277"]+$

这基本上是一个正则表达式,其八进制值表示 U+4E00 和 U+9FFF 之间的范围,这是最常见的中文和日文字符。

【讨论】:

【参考方案3】:

Oniguruma 正则表达式引擎对 Unicode 有适当的支持。 Ruby 1.9 默认使用 Oniguruma。 Ruby 1.8 可以重新编译使用。

使用 Oniguruma,您可以使用与 PHP 中完全相同的正则表达式,包括 /u 修饰符以强制 Ruby 将字符串视为 UTF-8。

【讨论】:

【参考方案4】:

activeSupport 有一个 UTF-8 处理程序

http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Handlers/UTF8Handler.html


否则,请查看 ruby​​ 1.9,Regexp 对象的编码方法

【讨论】:

那是因为它自 ActiveSupport 2.1 以来已被弃用:apidock.com/rails/ActiveSupport/Multibyte/Handlers

以上是关于如何在 ruby​​ 中使用 utf8 的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何获取字符串中所有出现的 Ruby 正则表达式的匹配数据?

使用正则表达式从 Ruby 中的字符串中提取子字符串

Ruby:正则表达式中的十六进制

什么是 '?-mix' 在 Ruby 正则表达式中

在 Ruby gsub 块中使用命名的捕获组(正则表达式)

Ruby 正则表达式中 \A \z 和 ^ $ 之间的区别