如何删除特殊字符?

Yud*_*Yud 46 ruby regex ruby-on-rails

我正在练习Ruby和正则表达式删除某些不需要的字符.例如:

input = input.gsub(/<\/?[^>]*>/, '')
Run Code Online (Sandbox Code Playgroud)

对于特殊字符,例如☻或™:

input = input.gsub('&#', '')
Run Code Online (Sandbox Code Playgroud)

这只留下数字,好的.但这仅在用户输入特殊字符作为代码时才有效,如下所示:

&#153;
Run Code Online (Sandbox Code Playgroud)

我的问题: 如果用户输入没有代码的特殊字符,如何删除特殊字符,如下所示:

™ ?
Run Code Online (Sandbox Code Playgroud)

Can*_*der 110

首先,我认为定义什么构成"正确的输入"并删除其他所有内容可能更容易.例如:

input = input.gsub(/[^0-9A-Za-z]/, '')
Run Code Online (Sandbox Code Playgroud)

如果那不是你想要的(你想支持非拉丁字母等),那么我认为你应该列出你要删除的字形(如™或☻),并逐个删除它们因为很难以编程方式区分中文,阿拉伯语等字符和象形文字.

最后,您可能希望通过转换为HTML转义序列或从HTML转义序列转换来规范化您的输入.


Mat*_*kel 10

如果您只想要ASCII字符,那么您可以使用:

original = "aøbauhrhræoeuacå" 
cleaned = ""
original.each_byte { |x|  cleaned << x unless x > 127   }
cleaned   # => "abauhrhroeuac"
Run Code Online (Sandbox Code Playgroud)


Mag*_*nar 8

您可以匹配所需的所有字符,然后将它们连接在一起,如下所示:

original = "aøbæcå"
stripped = original.scan(/[a-zA-Z]/).to_s
puts stripped
Run Code Online (Sandbox Code Playgroud)

哪个输出 "abc"


sts*_*sts 8

您可以使用参数化:

'@!#$%^&*()111'.parameterize
 => "111" 
Run Code Online (Sandbox Code Playgroud)


Mar*_*rco 5

由Can BerkGüder回答启发的一种更简单的方法是:

为了删除特殊字符:

input = input.gsub(/\W/, '')
Run Code Online (Sandbox Code Playgroud)

为了保留文字字符:

input = input.scan(/\w/)
Run Code Online (Sandbox Code Playgroud)

最后输入是一样的!尝试:http : //rubular.com/