【问题标题】:Ruby regexp handling of nbspnbsp 的 Ruby 正则表达式处理
【发布时间】:2016-01-26 12:13:50
【问题描述】:

在 ruby​​ 1.9.3 中,正则表达式引擎不会将 nbsp (\u00A0) 视为空格 (\s)。这对我来说常常是一个无赖。

所以我的问题是,这会在 2.0 中发生变化吗?如果没有,有没有办法猴子补丁解决方案?

【问题讨论】:

    标签: ruby regex ruby-2.0


    【解决方案1】:

    使用 Unicode 属性(您需要声明匹配的源代码编码才能使用):

    # encoding=utf-8 
    if subject ~= /\p{Z}/
        # subject contains whitespace or other separators
    

    或使用 POSIX 字符类:

    if subject ~= /[[:space:]]/
    

    根据the docs,\s 现在和将来只会匹配[ \t\r\n\f]。

    【讨论】:

    • 感谢蒂姆,\p{Z} 很有趣。你能解释一下你所说的其他分隔符是什么意思吗?
    • @pguardiario:对不起,我不知何故错过了你的评论。 Unicode 标准定义了许多其他分隔符,这些分隔符似乎主要用在东方语言中,其中单词不一定用空格分隔。
    【解决方案2】:

    在 Ruby 中,我推荐使用“空格分隔符”\p{Zs}的Unicode字符类:

    /\p{Zs}/u  =~  "\xC2\xA0"
    /\p{Zs}/u  =~  "\u00A0"
    /\p{Zs}/u  =~  HTMLEntities.new.decode(' ')
    

    有关更多信息,请参阅 Ruby 文档Unicode character properties。

    注意:请确保您的输入字符串是有效的 UTF-8 编码。其他编码中也有不间断的空格,例如ISO-8859-1 (Latin1) 中的“\xA0”。 More info on the "non-breaking space".

    仅供参考:在大多数支持 Unicode 的 RegExp 风格和编程语言中,字符类 \s 通常包括来自 Unicode“分隔符”属性 \p{Z} 的所有字符(如 Tim Pietcker 所述);但是,Java 和 Ruby 是这里流行的例外,\s 仅匹配 [ \t\r\n\f]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 2012-10-17
      • 2019-04-29
      • 2011-09-14
      • 1970-01-01
      • 2022-07-15
      相关资源
      最近更新 更多