2010-08-05 202 views
0

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

str = "subscripción gustaría♥" 

我想输出为"subscripción gustaría"

我试图做的是,匹配任何不是ascii字符(00 - 7F)而不是我想要的特殊字符,并将其替换为空白。

str.gsub(/(=?[^\x00-\x7F])(=?^\xC3\xB3)(=?^\xC3\xA1)/,'') 

这不起作用。最后一个特殊字符不会被删除。

有人可以帮忙吗? (这是红宝石1.8)

更新:我试图让问题更清楚一点。该字符串是utf-8编码的。我试图将ascii角色加上ó和í,将其他所有内容列入黑名单。

回答

1
str.split('').find_all {|c| (0x00..0x7f).include? c.ord }.join('') 
+0

不,这删除了所有的特殊字符。我只想♥被删除,而不是ó和í – maheshmurthy 2010-08-05 22:38:07

1

这个问题有点含糊。关于字符串的编码没有一个字。此外,你想白名单字符或黑名单?哪个? 但是你明白了,决定你想要什么,然后使用适当的范围作为这里已经提出的同事。一些例子: 如果str = “subscripcióngustaría♥” 是UTF-8 则可以黑名单上述范围内的所有字符(不包括空格):

 str.gsub(/[^\x{0021}-\x{017E}\s]/,'') 

如果字符串是在ISO-8859-1代码页你可以尝试搭配就像从ASCII范围开始的“心脏”的所有文字古怪:

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

的问题是在这里与正则表达式,无关与红宝石。您可能需要尝试更多。

+0

是的,我的坏,我应该提到它是utf-8编码。我明白你的意思。我正在尝试将6个特殊字符列入白名单。所以,我试图得到的是“如果不在00-7F范围内而不是\ xC3 \ xB3而不是\ xC3 \ xA1”,那么将其替换为空白。 当我尝试上述解决方案时,出现语法错误。它不喜欢大括号。 – maheshmurthy 2010-08-05 23:47:10

+1

黑名单是一个坏主意。谁知道可能会在那里。你明确地说出你会接受什么,这样就没有惊喜。 – 2010-08-05 23:52:41

+0

是的,我也不好,我在用PHP的想法,很抱歉我的坏的正则表达式。 看看马克威尔金斯的答案,我测试了它,它在这个例子中起作用。 – Ernest 2010-08-06 00:19:52

0

这并不完全清楚你想保留哪些字符以及你想删除哪些字符。示例字符串的字符是一些Unicode字符,在我的浏览器中显示为心脏符号。但似乎你正在处理8位ASCII字符(因为你使用的是Ruby 1.8,而你的正则表达式就是这样指向的)。

尽管如此,你应该能够以两种方式之一来完成它;要么指定要保留的字符,要么指定要删除的字符。例如,下面指定所有字符为0x00-0x7F和0xC0-0xF6应保持(删除一切,是不是该组中):

puts str.gsub(/[^\x00-\x7F\xC0-\xF6]/,'') 

下一个例子指定字符0xA1和0xC3应予删除。

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

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 
0

我结束了这样做的:str.gsub(/ [^ \ x00- \x7FÁáÉéÍíÑñÓóÚúÜü] /, '')。它不适用于我的Mac,但适用于Linux。

+0

然后你应该看看我的答案,它适用于我的Mac,并且不匹配字节,这可能最终导致你的错误。 – 2010-08-17 14:34:11