Ruby 删除除某些特殊字符以外的所有字符

Ruby 删除除某些特殊字符以外的所有字符,ruby,regex,Ruby,Regex,我试图想出一个正则表达式来删除除一些字符以外的所有特殊字符。例如,我有一个字符串: str = "subscripción gustaría♥" 我希望输出是“subscribpción gustaría” 我尝试的方法是,匹配任何不是ascii字符(00-7F)且不是我想要的特殊字符的内容,并将其替换为空白 str.gsub(/(=?[^\x00-\x7F])(=?^\xC3\xB3)(=?^\xC3\xA1)/,'') 这不管用。最后一个特殊字符不会被删除 有人能帮忙吗?(这是ruby

我试图想出一个正则表达式来删除除一些字符以外的所有特殊字符。例如,我有一个字符串:

str = "subscripción gustaría♥"
我希望输出是
“subscribpción gustaría”

我尝试的方法是,匹配任何不是ascii字符(00-7F)且不是我想要的特殊字符的内容,并将其替换为空白

str.gsub(/(=?[^\x00-\x7F])(=?^\xC3\xB3)(=?^\xC3\xA1)/,'') 
这不管用。最后一个特殊字符不会被删除

有人能帮忙吗?(这是ruby 1.8)


更新:我想把问题弄清楚一点。该字符串是utf-8编码的。我试图将ascii字符加上ó和í列为白名单,将其他所有字符列为黑名单。

这个问题有点模糊。关于字符串的编码一个字也没有。另外,您要白名单字符还是黑名单字符?哪一个?
str.split('').find_all {|c| (0x00..0x7f).include? c.ord }.join('')
但是你得到了这个想法,决定你想要什么,然后像这里的同事已经提议的那样使用适当的范围。一些例子: 如果str=“subscribpción gustaría♥" 是utf-8吗 然后您可以将该范围(不包括空格)以上的所有字符列入黑名单:

如果字符串在ISO-8859-1代码页中,您可以尝试匹配ASCII范围开头的所有奇怪字符,如“heart”:

    str.gsub(/[\x01-\x1F]/,'')

这里的问题是正则表达式,与Ruby无关。您可能需要进行更多的实验。

问题有点模糊。字符串的编码没有一个词。此外,您想要白名单字符还是黑名单?哪些字符? 但是你得到了这个想法,决定了你想要什么,然后像这里的同事已经建议的那样使用适当的范围。一些例子: 如果str=“subscribpción gustaría♥“是utf-8吗 然后您可以将该范围(不包括空格)以上的所有字符列入黑名单:

如果字符串在ISO-8859-1代码页中,您可以尝试匹配ASCII范围开头的所有奇怪字符,如“heart”:

    str.gsub(/[\x01-\x1F]/,'')

问题在于正则表达式,它与Ruby无关。您可能需要进行更多的实验。

不完全清楚要保留哪些字符以及要删除哪些字符。示例字符串的字符是一些Unicode字符,在我的浏览器中显示为心形符号。但似乎您正在处理8-b它包含ASCII字符(因为您使用的是ruby 1.8,并且正则表达式指向那个方向)

尽管如此,您应该能够通过以下两种方式之一进行操作:指定要保留的字符,或者指定要删除的字符。例如,以下内容指定应保留所有字符0x00-0x7F和0xC0-0xF6(删除不在该组中的所有字符):

下一个示例指定应删除字符0xA1和0xC3

puts str.gsub(/[\xA1\xC3]/,'') 

还不完全清楚要保留哪些字符以及要删除哪些字符。示例字符串的字符是某些Unicode字符,在我的浏览器中显示为心形符号。但您似乎正在处理8位ASCII字符(因为您使用的是ruby 1.8,正则表达式指向该方向)

尽管如此,您应该能够通过以下两种方式之一进行操作:指定要保留的字符,或者指定要删除的字符。例如,以下内容指定应保留所有字符0x00-0x7F和0xC0-0xF6(删除不在该组中的所有字符):

下一个示例指定应删除字符0xA1和0xC3

puts str.gsub(/[\xA1\xC3]/,'') 

Oniguruma支持您关心的所有字符,而无需处理代码点。您只需在白名单中的字符类中添加unicode字符,然后添加“u”选项即可

ruby-1.8.7-p248 > str = "subscripción gustaría♥"
 => "subscripci\303\263n gustar\303\255a\342\231\245" 
ruby-1.8.7-p248 > puts str.gsub(/[^a-zA-Z\sáéíóúÁÉÍÓÚ]/u,'')
subscripción gustaría
 => nil 

Oniguruma支持您关心的所有字符,而无需处理代码点。您只需在白名单中的字符类中添加unicode字符,然后添加“u”选项即可

ruby-1.8.7-p248 > str = "subscripción gustaría♥"
 => "subscripci\303\263n gustar\303\255a\342\231\245" 
ruby-1.8.7-p248 > puts str.gsub(/[^a-zA-Z\sáéíóúÁÉÍÓÚ]/u,'')
subscripción gustaría
 => nil 

我最后这样做了:str.gsub(/[^\x00-\x7FÁáÍíñÓÚÜü]/,“”)。它在我的mac上不工作,但在linux上工作。

我最后这样做了:str.gsub(/[^\x00-\x7FÁÍÍíñÓÚÜÜü]/,“”)。它在我的mac上不工作,但在linux上工作。

不,这删除了所有特殊字符。我只想要♥ 要删除而不是óandíNo,这删除了所有特殊字符。我只想♥ 是的,我的错,我应该提到它是utf-8编码的。我明白你的意思。我只是想把6个特殊字符列入白名单。所以,我想说的是“如果不在00-7F范围内,不在\xC3\xB3和\xC3\xA1范围内。”,然后将其替换为空白。我在尝试上面的解决方案时遇到语法错误。它不喜欢花括号。把它列入黑名单是个坏主意。谁知道外面会发生什么。你最好准确地说出你将要接受的,这样就不会有什么意外了。是的,我也很糟糕,我在用PHP思考,所以为我糟糕的正则表达式感到抱歉。看看马克·威尔金斯的答案,我测试了它,它在这个例子中起了作用。是的,我的错,我应该提到它是utf-8编码的。我明白你的意思。我试图将6个特殊字符列入白名单。所以,我想说的是“如果不在00-7F范围内,不在\xC3\xB3和\xC3\xA1范围内”,然后用空白替换它。我在尝试上面的解决方案时遇到语法错误。它不喜欢花括号。把它列入黑名单是个坏主意。谁知道外面会发生什么。你最好准确地说出你将要接受的,这样就不会有什么意外了。是的,我也很糟糕,我在用PHP思考,所以为我糟糕的正则表达式感到抱歉。看看Mark Wilkins的答案,我测试了它,在这个例子中它起了作用。然后你应该检查我的答案,它在我的Mac电脑上工作,但不匹配字节,这可能会对你造成错误。然后你应该检查我的答案,它在我的Mac电脑上工作,但不匹配字节,这可能会对你造成错误。