我正在尝试从字符串中删除非字母。这会这样做:
c = o.replace(o.gsub!(/\W+/, ''))
答案 0 :(得分:25)
只需gsub!
即可:
o.gsub!(/\W+/, '')
请注意,gsub!
会修改原始o
对象。此外,如果o
不包含任何非单词字符,则结果将为nil
,因此使用返回值作为修改后的字符串是不可靠的。
你可能想要这个:
c = o.gsub(/\W+/, '')
答案 1 :(得分:6)
删除任何不是字母的内容:
> " sd 190i.2912390123.aaabbcd".gsub(/[^a-zA-Z]/, '')
"sdiaaabbcd"
编辑:正如池上所指出的,这并没有考虑重音字符,变音符号和其他类似字符。这个问题的解决方案将取决于你究竟指的是“不是一封信”。此外,您的输入将是什么。
答案 2 :(得分:3)
大多数情况都适用,除非o
最初不包含任何非字母,在这种情况下gsub!
将返回nil
。
如果你只想要一个替换的字符串,它可以更简单:
c = o.gsub(/\W+/, '')
答案 3 :(得分:2)
使用\W
或\w
仅选择或删除字符不起作用。 \w
表示A-Z,a-z,0-9和“_”:
irb(main):002:0> characters = (' ' .. "\x7e").to_a.join('')
=> " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
irb(main):003:0> characters.gsub(/\W+/, '')
=> "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
因此,使用\W
进行剥离会保留数字和下划线。
如果要匹配字符,请使用/[A-Za-z]+/
或POSIX字符类[:alpha:]
,即/[[:alpha:]]+/
或/\p{ALPHA}/
。
最终格式是ASCII中的'A'...'Z'+'a'...'z'的Unicode属性,并且在处理Unicode时会被扩展,所以如果你有多字节字符,你应该使用它
答案 4 :(得分:2)
请记住,ruby认为下划线_
是一个单词字符。所以,如果你想保留下划线,这应该做到
string.gsub!(/\W+/, '')
否则,您需要这样做:
string.gsub!(/[^a-zA-Z]/, '')
答案 5 :(得分:1)
如果你有一个字符串,我看不到o.replace
的内容:
string = 't = 4 6 ^'
你这样做:
string.gsub!(/\W+/, '')
你得到:
t46
如果你想摆脱数字字符,你可以这样做:
string.gsub!(/\W+|\d+/, '')
你得到:
t
答案 6 :(得分:1)
使用Regexp#union创建一个大的匹配对象
allowed = Regexp.union(/[a-zA-Z0-9]/, " ", "-", ":", ")", "(", ".")
cleanstring = dirty_string.chars.select {|c| c =~ allowed}.join("")