在Ruby中使用Split时保留变音字符

时间:2013-04-11 14:59:56

标签: ruby split

为什么这段代码(包含变音符号):

text = "Some super text with a german umlaut Wirtschaftsprüfer"
words = text.split(/\W+/)
words.each do |w|
  puts w
end

返回此结果(不保留以前给定的变音符号):

=> Some
=> super
=> text
=> with
=> a
=> german
=> umlaut
=> Wirtschaftspr
=> fer

在Ruby 1.9 +中分割字符串时,有没有办法保留变音符号?

编辑:我使用ruby 1.9.3p286(2012-10-12修订版37165)[x86_64-darwin11.4.2]

5 个答案:

答案 0 :(得分:5)

[\W]只匹配非单词字符,即它等同于[^a-zA-Z0-9_],因此不包括(排除?)特殊字符和变音符号。你可以使用

words = text.split(/[^[:word:]]/)

匹配所有Unicode“word”字符或

words = text.split(/[^\p{Latin}]/)

匹配Unicode Latin脚本中的字符。
请注意,这两个语句都匹配其他语言的特殊字符,而不仅仅是德语。

参见http://www.ruby-doc.org/core-1.9.3/Regexp.html并查找(1)“字符类”和(2)“字符属性”。

答案 1 :(得分:2)

您可以将/\W+/替换为/\s+/\s匹配空格字符:空格,制表符,新行)

答案 2 :(得分:2)

  

为什么此代码[...]不会保留以前给定的变音符号

因为\W匹配非词 ASCII 字符(即不是a-z,不是A-Z,不是0-9而不是{{1 }}和_就是这样一个角色。

  

在Ruby 1.9 +中分割字符串时,有没有办法保留变音符号?

当然,您可以例如按空格分割,如果没有给出模式,这是默认值:

ü

答案 3 :(得分:1)

来自Ruby doc

  

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

ü不是单词字符,因此\W匹配并拆分。 \p{Lu}\p{Ll}是用于unicode uper和小写字符的ruby shorthands,所以你可以这样做:

text.split /[^\p{Ll}\p{Lu}]/

......并且应该将最奇特的字符串分开。

答案 4 :(得分:0)

因为您使用/ \ W /来分割文本,这意味着不在此列表中的任何内容: A-ZA-Z0-9

尝试拆分

[^ \ W \ü]

^不在 \ w a-zA-Z0-9 \ü

(或者看看你可以重复创建自己的模式)

http://ruby-doc.org/core-1.9.3/Regexp.html参考