【问题标题】:Regexp does not match utf8 characters in words (\w+) [duplicate]正则表达式不匹配单词中的 utf8 字符 (\w+) [重复]
【发布时间】:2013-11-28 15:00:07
【问题描述】:

为什么下面的代码返回nil:

'The name of the city is: Ørbæk'.match(/:\s\w+/)
#=> nil

当我期望它返回 "Ørbæk"

我尝试在文档开头设置#encoding=utf-8,但它没有任何改变。

PS。 Ø 和 Æ 是丹麦字母

【问题讨论】:

    标签: ruby-on-rails ruby regex


    【解决方案1】:

    元字符\w等价于字符类[a-zA-Z0-9_];仅匹配字母、数字和_

    改为使用字符属性\p{Word}

    'The name of the city is: Ørbæk'.match(/:\s\p{Word}+/)
    # => #<MatchData ": Ørbæk">
    

    根据Character Properties from Ruby Regexp documentation

    /\p{Word}/ - 以下 Unicode 通用类别之一的成员 Letter、Mark、Number、Connector_Punctuation

    【讨论】:

      【解决方案2】:

      您可以使用 \p{Word} 代替:

      irb(main):001:0> 'The name of the city is: Ørbæk'.match(/:\s\p{Word}+/)
      => #<MatchData ": Ørbæk">
      

      【讨论】:

        【解决方案3】:

        如果您要匹配的单词仅包含字母字符,则使用\p{L}

        match(/:\s\p{L}+/)
        

        【讨论】:

          猜你喜欢
          • 2020-06-01
          • 1970-01-01
          • 2013-01-28
          • 2016-03-17
          • 1970-01-01
          • 2016-12-06
          • 2013-10-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多