【问题标题】:Regex matches non-english letters as non-word characters正则表达式将非英文字母匹配为非单词字符
【发布时间】:2013-05-22 22:48:08
【问题描述】:
@raw_array[i]=~/[\W]/

非常简单的正则表达式。 当我用一些非拉丁字母(具体是俄语)尝试它时,条件是错误的。

我能用这个做什么?

【问题讨论】:

  • 尝试使用^\pL 而不是\W

标签: ruby regex


【解决方案1】:
@raw_array[i] =~ /[\p{L}]/

用西里尔字符测试。

参考:http://www.regular-expressions.info/unicode.html#prop

【讨论】:

    【解决方案2】:

    来自Regexp documentation

    /\W/ - 非单词字符 ([^a-zA-Z0-9_])

    它特别不支持 Unicode。也许这样的事情会更适合你:

    @raw_array[i]=~/[^[:word:]]/
    

    【讨论】:

    • 这就是重点。 \W 不幸的是不知道Unicode。所以你需要使用不幸的是更晦涩难懂的 Unicode 字符类。但不要说西里尔文不是 Unicode。 Unicode 是一组包含西里尔字母的编码。西里尔文也以 KOI-8 等形式编码,字体使用相同的字节。
    • @JoeHalfFace 我不确定你不理解什么——你的问题是关于为什么\W 字符类将一些非拉丁字母视为非单词字符。我解释说该字符类不支持 Unicode。如上所述,它对构成“单词”字符的定义非常狭窄。然后,我向您展示了一个可识别 Unicode 的字符类,它或多或少地按照您希望 \W 的方式工作。
    • 关于 Unicode 我弄错了,但在 irb:?> 'ываыва'=~/[[:word:]]/ => nil
    • @JoeHalfFace 这很奇怪; irb 在我的机器上返回 0
    • 有些奇怪...>> RUBY_VERSION => "1.9.3"。但正如我可以在 Rubular 中检查的那样,ruby 的行为低于 1.9 。我不知道发生了什么......
    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多