为什么这段代码(包含变音符号):
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]
答案 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 \ü
(或者看看你可以重复创建自己的模式)