2012-02-12 192 views
6

如果我想删除喜欢的事物:! “,”^ - #从字符串数组,我将如何去了解这一点的同时保留所有的字母和数字字符从字符串中删除所有非字母,非数字字符?

允许的字母字符也应该包括字母。与

+1

http://stackoverflow.com/questions/737475/how-i-can-delete-special-characters这将回答你的问题的50% – Devjosh 2012-02-12 03:21:50

+2

通常我们谈论一个字符串和一个具有不同数据的数组,例如对象,数字或字符串。你真的有一个数组(可能是一个字符串数组?)或只是一个字符串? – Phrogz 2012-02-12 04:34:46

+0

-1。不是因为不试图解决问题,而是因为Phrogz给出的理由,这个问题是无意义的。 – 2012-02-12 08:32:17

回答

17

区别标记包括A或C,您应该使用正则表达式用正确的字符属性在这种情况下,您可以反转Alnum类(字母和数字字符):

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

对于更复杂案件,说你想要的也标点,你也可以建立类似的一套可接受的字符:

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

对于所有字符属性,你可以参考doc

+0

请注意,您正在回答如何在字符串上使用gsub,但标题和说明使用单词“array”。 – Phrogz 2012-02-12 04:35:20

+1

@Progro:的确。希望OP知道如何做一个map。 – 2012-02-12 04:40:51

+1

+1用于显示正确的Unicode集。 – Phrogz 2012-02-12 04:47:57

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

你可能会考虑一个正则表达式。

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

我假设你正在使用的红宝石,因为你加了标签,在您的文章。你可以通过数组,通过一个使用正则表达式的测试,如果它通过移除/保持它基于你使用的正则表达式。

您可以使用可能会去一些像这样的正则表达式:

[^.!,^-#] 

会告诉你,如果它不括号里面的人物之一。但是,我建议您查看正则表达式,一旦知道它们的语法和用法,您可能会找到更好的解决方案。

3

下面将针对array工作:

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

我借杰里米的建议regex

+0

谢谢Phrogz,我完全错过了。 :) – kikuchiyo 2012-02-13 01:13:33

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锚正则表达式的字符串的开始nd \z锚点到底。

相关问题