正则表达式删除非字母

时间:2011-03-24 19:17:19

标签: ruby regex

我正在尝试从字符串中删除非字母。这会这样做:

c = o.replace(o.gsub!(/\W+/, ''))

7 个答案:

答案 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("")