我正在尝试使用正则表达式删除除了某些特殊字符之外的所有特殊字符。例如,我有一个字符串:
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字符列入白名单加上ó和í,并将其他所有内容列入黑名单。
答案 0 :(得分: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
答案 1 :(得分:1)
str.split('').find_all {|c| (0x00..0x7f).include? c.ord }.join('')
答案 2 :(得分:1)
问题有点模糊。关于字符串的编码没有一个词。此外,你想要列出白名单或黑名单?哪个? 但你得到了想法,决定你想要什么,然后使用适当的范围作为已经提出的同事。一些例子: 如果str =“subscripcióngustaría♥”是utf-8 然后你可以将范围之上的所有字符列入黑名单(不包括空格):
str.gsub(/[^\x{0021}-\x{017E}\s]/,'')
如果字符串在ISO-8859-1代码页中,您可以尝试匹配所有古怪字符,例如ASCII范围开头的“心脏”:
str.gsub(/[\x01-\x1F]/,'')
问题在于正则表达式,与Ruby无关。您可能需要进行更多实验。
答案 3 :(得分: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]/,'')
答案 4 :(得分:0)
我最终这样做了:str.gsub(/ [^ \ x00- \x7FÁáÉéÍíÑñÓóÚúÜü] /,'')。它在我的Mac上不起作用,但适用于Linux。