【问题标题】:Remove all but some special characters删除除一些特殊字符外的所有字符
【发布时间】:2010-08-05 22:03:27
【问题描述】:

我正在尝试提出一个正则表达式来删除除某些特殊字符之外的所有特殊字符。比如我有一个字符串:

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 字符加上 ó 和 í 列入白名单,并将其他所有内容列入黑名单。

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    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 
    

    【讨论】:

      【解决方案2】:
      str.split('').find_all {|c| (0x00..0x7f).include? c.ord }.join('')
      

      【讨论】:

      • 不,这删除了所有特殊字符。我只想删除 ♥ 而不是 ó 和 í
      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 是的,我的错,我应该提到它是 utf-8 编码的。我明白你的意思了。我试图将 6 个特殊字符列入白名单。所以,我想要得到的是“如果不在 00-7F 范围内,也不在 \xC3\xB3 和 \xC3\xA1 范围内”,则将其替换为空白。当我尝试上面的解决方案时出现语法错误。它不喜欢花括号。
      • 黑名单是个坏主意。谁知道外面会有什么。你最好直接说出你会接受的东西,这样就不会有意外了。
      • 是的,我也很糟糕,我在用 PHP 思考,很抱歉我的正则表达式不好。看看 Mark Wilkins 的回答,我对其进行了测试,它在这个例子中很有效。
      【解决方案4】:

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

      尽管如此,您应该能够通过以下两种方式之一来做到这一点;要么指定要保留的字符,要么指定要删除的字符。例如,以下指定应保留所有字符 0x00-0x7F 和 0xC0-0xF6(删除不在该组中的所有字符):

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 那你应该看看我的答案,它适用于我的 Mac 并且与字节不匹配,这对你来说可能是错误的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        相关资源
        最近更新 更多