删除除一些特殊字符以外的所有字符
我想要提供一个正则表达式来删除除某些字符以外的所有特殊字符。例如,我有一个字符串:删除除一些特殊字符以外的所有字符
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角色加上ó和í,将其他所有内容列入黑名单。
str.split('').find_all {|c| (0x00..0x7f).include? c.ord }.join('')
这个问题有点含糊。关于字符串的编码没有一个字。此外,你想白名单字符或黑名单?哪个? 但是你明白了,决定你想要什么,然后使用适当的范围作为这里已经提出的同事。一些例子: 如果str = “subscripcióngustaría♥” 是UTF-8 则可以黑名单上述范围内的所有字符(不包括空格):
str.gsub(/[^\x{0021}-\x{017E}\s]/,'')
如果字符串是在ISO-8859-1代码页你可以尝试搭配就像从ASCII范围开始的“心脏”的所有文字古怪:
str.gsub(/[\x01-\x1F]/,'')
的问题是在这里与正则表达式,无关与红宝石。您可能需要尝试更多。
是的,我的坏,我应该提到它是utf-8编码。我明白你的意思。我正在尝试将6个特殊字符列入白名单。所以,我试图得到的是“如果不在00-7F范围内而不是\ xC3 \ xB3而不是\ xC3 \ xA1”,那么将其替换为空白。 当我尝试上述解决方案时,出现语法错误。它不喜欢大括号。 – maheshmurthy 2010-08-05 23:47:10
黑名单是一个坏主意。谁知道可能会在那里。你明确地说出你会接受什么,这样就没有惊喜。 – 2010-08-05 23:52:41
是的,我也不好,我在用PHP的想法,很抱歉我的坏的正则表达式。 看看马克威尔金斯的答案,我测试了它,它在这个例子中起作用。 – Ernest 2010-08-06 00:19:52
这并不完全清楚你想保留哪些字符以及你想删除哪些字符。示例字符串的字符是一些Unicode字符,在我的浏览器中显示为心脏符号。但似乎你正在处理8位ASCII字符(因为你使用的是Ruby 1.8,而你的正则表达式就是这样指向的)。
尽管如此,你应该能够以两种方式之一来完成它;要么指定要保留的字符,要么指定要删除的字符。例如,下面指定所有字符为0x00-0x7F和0xC0-0xF6应保持(删除一切,是不是该组中):
puts str.gsub(/[^\x00-\x7F\xC0-\xF6]/,'')
下一个例子指定字符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
我结束了这样做的:str.gsub(/ [^ \ x00- \x7FÁáÉéÍíÑñÓóÚúÜü] /, '')。它不适用于我的Mac,但适用于Linux。
然后你应该看看我的答案,它适用于我的Mac,并且不匹配字节,这可能最终导致你的错误。 – 2010-08-17 14:34:11
不,这删除了所有的特殊字符。我只想♥被删除,而不是ó和í – maheshmurthy 2010-08-05 22:38:07