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

6
如果我想从一个字符串数组中删除像.!,'"^-#这样的字符,同时保留所有字母和数字字符,应该怎么做呢?
允许的字母字符也应包括带有变音符号的字母,例如à或ç。

1
https://dev59.com/snRB5IYBdhLWcg3wCjnO 这可以回答你问题的50%。 - Devjosh
2
通常我们谈论一个字符串包含字符,而数组包含不同的数据类型,例如对象、数字或字符串。您是否真的拥有一个数组(可能是字符串数组?)还是只有一个字符串? - Phrogz
-1. 不是因为没有尝试解决问题,而是因为Phrogz提出的原因使得这个问题毫无意义。 - Andrew Grimm
一个字符串数组的哈希表。不错啊。(什么?) - Phrogz
5个回答

18

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

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

对于更复杂的情况,比如说你还想包括标点符号在内,你也可以构建一组可接受的字符,例如:

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

对于所有字符属性,您可以参考文档


请注意,您正在回答如何在字符串上进行gsub操作,但标题和描述中使用了“数组”一词。 - Phrogz
1
@Phrogz:确实。希望原帖作者知道如何使用 map 函数。 - Marc-André Lafortune

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

3
以下内容适用于一个数组:
z = ['asfdå', 'b12398!', 'c98347']
z.each { |s| s.gsub! /[^[:alnum:]]/, '' }
puts z.inspect

我借用了Jeremy建议的正则表达式。

谢谢Phrogz,我完全没注意到。 :) - kikuchiyo

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

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

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

您可能会使用以下类似的正则表达式:

[^.!,^-#]

这将告诉您它是否不是括号内的任何一个字符。然而,我建议您查阅正则表达式,一旦您了解它们的语法和用法,您可能会找到更好的解决方案。


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 锚定了结尾。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接