从字符串中删除所有非字母,非数字字符?

时间:2012-02-12 03:17:45

标签: ruby regex string

如果我想删除以下内容: 。!,'“^ - #来自一个字符串数组,如何在保留所有字母和数字字符的同时进行此操作。

允许的字母字符还应包括带变音标记的字母,包括à或ç。

5 个答案:

答案 0 :(得分:17)

您应该使用具有正确字符属性的正则表达式。在这种情况下,您可以反转Alnum类(字母和数字字符):

"◊¡ Marc-André !◊".gsub(/\p{^Alnum}/, '') # => "MarcAndré"

对于更复杂的情况,假设您还想要标点符号,您还可以构建一组可接受的字符,如:

"◊¡ Marc-André !◊".gsub(/[^\p{Alnum}\p{Punct}]/, '') # => "¡MarcAndré!"

对于所有角色属性,您可以参考doc

答案 1 :(得分:3)

string.gsub(/[^[:alnum:]]/, "")

答案 2 :(得分:3)

以下内容适用于array

z = ['asfdå', 'b12398!', 'c98347']
z.each { |s| s.gsub! /[^[:alnum:]]/, '' }
puts z.inspect

我借用了杰里米的建议regex

答案 3 :(得分:1)

您可以考虑使用正则表达式。

http://www.regular-expressions.info/ruby.html

我假设您使用的是ruby,因为您在帖子中标记了它。您可以浏览数组,使用正则表达式进行测试,如果通过则根据您使用的正则表达式删除/保留它。

你可能使用的正则表达式可能是这样的:

[^.!,^-#]

这会告诉你它的不是括号内的一个字符。但是,我建议您查找正则表达式,一旦您知道它们的语法和用法,就可以找到更好的解决方案。

答案 4 :(得分:1)

如果你真的有一个数组(如你所述)并且它是一个字符串数组(我猜),例如。

foo = [ "hello", "42 cats!", "yöwza" ]

然后我可以想象你要么想用一个新值更新数组中的每个字符串,要么想要一个只包含某些字符串的修改过的数组。

如果是前者(你想要“清理”每个字符串的数组),你可以做以下其中一项:

foo.each{ |s| s.gsub! /\p{^Alnum}/, '' }     # Change every string in place…
bar = foo.map{ |s| s.gsub /\p{^Alnum}/, '' } # …or make an array of new strings
#=> [ "hello", "42cats", "yöwza" ]

如果是后者(你想选择一个字符串的子集,每个字符串符合你只持有字母数字的标准)你可以使用以下其中一个:

# Select only those strings that contain ONLY alphanumerics
bar = foo.select{ |s| s =~ /\A\p{Alnum}+\z/ }
#=> [ "hello", "yöwza" ]

# Shorthand method for the same thing
bar = foo.grep /\A\p{Alnum}+\z/     
#=> [ "hello", "yöwza" ]

在Ruby中,/\A………\z/形式的正则表达式要求整个字符串匹配,因为\A将正则表达式锚定到字符串的开头,\z锚定到结尾。