【问题标题】:How to match unicode words with ruby 1.9?如何将 unicode 单词与 ruby​​ 1.9 匹配?
【发布时间】:2026-02-16 04:30:02
【问题描述】:

我正在使用 ruby​​ 1.9 并试图找出我需要哪个正则表达式来实现这一点:

Encoding.default_internal = Encoding.default_external = 'utf-8'
"föö".match(/(\w+)/u)[1] == "föö"
# => false

【问题讨论】:

  • 您必须将两个字符串都转换为相同的 unicode,才能匹配它。使用 Iconv,您可以将字符串转换为特定的 unicode。
  • 添加了默认编码。还是不行……
  • 尝试在脚本开头添加注释“# coding utf-8”并确保该脚本文件是utf-8。
  • 使用[/(\w+)/u,1] - 它更短。甚至只是[/\w+/u],因为您的正则表达式中的() 占据了一切。

标签: ruby regex unicode


【解决方案1】:
# encoding=utf-8 
p "föö".match(/\p{Word}+/)[0] == "föö"

【讨论】:

【解决方案2】:

您可以使用manually turn on Unicode matching 内部的(?u) 语法:

"föö".match(/(?u)(\w+)/)[1] == "föö"
# => true

但是,使用 Unicode 属性语法(steenslag 的回答)或 POSIX 括号语法是更好的风格,因为它们都自动尊重 Unicode 代码点:

"föö".match(/(\p{word}+)/)[1] == "föö"
# => true

"föö".match(/([[:word:]]+)/)[1] == "föö"
# => true

有关在 Ruby 正则表达式中匹配 Unicode 字符的更多信息,请参阅 this blog post

【讨论】:

    【解决方案3】:

    http://www.ruby-forum.com/topic/208777

    http://www.ruby-forum.com/topic/210770

    可能会给你一些线索。

    您还可以使用(记录在案的)\p{L} 属性,例如:

    $ ruby -ve "p '℉üüü' =~ /\p{L}/"
    ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
    1
    

    【讨论】: