【问题标题】:Deleting all special characters from a string - ruby从字符串中删除所有特殊字符 - ruby
【发布时间】:2014-02-22 03:48:10
【问题描述】:

我正在接受来自pythonchallenge 用 ruby​​ 编写代码的挑战,specifically this one。它在页面源中包含一个非常长的带有特殊字符的字符串。我试图找到一种方法来删除它们/检查字母字符。

我尝试使用扫描方法,但我想我可能无法正确使用它。我也试过delete!这样:

    a = "PAGE SOURCE CODE PASTED HERE"
    a.delete! "!", "@"  #and so on with special chars, does not work(?) 
    a

我该怎么做?

谢谢

【问题讨论】:

    标签: ruby special-characters


    【解决方案1】:

    我认为a.gsub(/[^A-Za-z0-9 ]/, '') 在这种情况下效果更好。否则,如果您有一个句子,通常应该以大写字母开头,您将失去大写字母。您还会丢失任何 1337 speak 或文本中其他可能的密码。

    例子:

    phrase = "Joe can't tell between 'large' and large." => "Joe can't tell between 'large' and large."

    phrase.gsub(/[^a-z ]/, '') => "oe cant tell between large and large"

    phrase.gsub(/[^A-Za-z0-9 ]/, '') => "Joe cant tell between large and large"

    phrase2 = "W3 a11 f10a7 d0wn h3r3!" phrase2.gsub(/[^a-z ]/, '') => " a fa dwn hr"

    phrase2.gsub(/[^A-Za-z0-9 ]/, '') => "W3 a11 f10a7 d0wn h3r3"

    【讨论】:

      【解决方案2】:

      gsub 是最常用的 Ruby 方法之一。

      specialname="Hello!#$@"
      cleanedname = specialname.gsub(/[^a-zA-Z0-9\-]/,"") 
      

      【讨论】:

        【解决方案3】:

        你可以这样做

        a.gsub!(/[^0-9A-Za-z]/, '')
        

        【讨论】:

          【解决方案4】:

          如果您不想更改原始字符串 - 即解决挑战。

          str.each_char do |letter|
            if letter =~ /[a-z]/  
              p letter    
            end  
          end  
          

          【讨论】:

            【解决方案5】:

            当您向string#delete 提供多个参数时,将删除这些参数的交集。 a.delete! "!", "@" 删除集合 !@ 的交集,这意味着不会删除任何内容,该方法返回 nil

            您想要做的是a.delete! "!@",其中要删除的字符作为单个字符串传递。

            由于挑战是要求清理混乱并在其中查找消息,因此我会使用白名单而不是删除特殊字符。 delete 方法接受带有- 的范围和带有^ 的否定(类似于正则表达式),因此您可以执行以下操作:a.delete! "^A-Za-z "

            您还可以使用如@arieljuod 所示的正则表达式。

            【讨论】:

              【解决方案6】:

              用 gsub 试试

              a.gsub!(/[!@%&"]/,'')
              

              在 rubular.com 上尝试正则表达式

              如果你想要更通用的东西,你可以有一个带有有效字符的字符串并删除其中不存在的内容:

              a.gsub!(/[^abcdefghijklmnopqrstuvwxyz ]/,'')
              

              【讨论】:

              • 我认为 [^A-Za-z ] 在这种情况下效果更好。否则,如果您有一个句子,通常应该以大写字母开头,您将失去大写字母。您还将丢失任何1337 speak 或文本中其他可能的密码。例如:phrase = "Joe can't tell between 'large' and large." => "Joe can't tell between 'large' and large."
              猜你喜欢
              • 2012-12-16
              • 2012-05-04
              • 2016-08-23
              • 2011-04-11
              • 2016-01-23
              相关资源
              最近更新 更多