正则表达式将非英文字母视为非单词字符

7
@raw_array[i]=~/[\W]/

非常简单的正则表达式。但是当我尝试使用一些非拉丁字母(具体来说是俄语)时,条件为 false。

我该怎么做呢?


1
尝试使用 ^\pL 替代 \W - Explosion Pills
2个回答

9

2

来自Regexp文档:

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

它并不特别支持Unicode。或许像这样的表达式会更适合你:

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

这就是问题所在。\W 不支持 Unicode,所以你需要使用更为晦涩的 Unicode 字符类。但请注意,西里尔字母并不是 Unicode。Unicode 是包括西里尔字母在内的多个编码集。西里尔字母也可以用像 KOI-8 这样的形式进行编码,使用相同的字节。 - uchuugaka
@JoeHalfFace,我不确定你不理解的是什么——你的问题是关于为什么\W字符类认为一些非拉丁字母是非单词字符。我解释了该字符类不具备Unicode感知能力;它对构成“单词”字符的定义非常狭窄,如上所述。然后,我向您展示了一个具有Unicode感知能力的字符类,其工作方式与您希望的\W类似。 - Darshan Rivka Whittle
关于Unicode,我误解了你,但在irb中:?> 'ываыва'=~/[[:word:]]/ => nil - Joe Half Face
@JoeHalfFace 这很奇怪;在我的机器上,irb返回0 - Darshan Rivka Whittle
非常奇怪... >> RUBY_VERSION =>“1.9.3”。但是我可以在Rubular中检查,Ruby的行为就像低于1.9一样。我无法弄清楚发生了什么... - Joe Half Face

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接