【问题标题】:Ruby remove everything except some characters?Ruby 删除除某些字符之外的所有内容?
【发布时间】:2012-03-14 20:25:04
【问题描述】:

如何从字符串中删除除空格、数字和其他字符之外的所有字符? 像这样的:

oneLine.gsub(/[^ULDR0-9\<\>\s]/i,'')

我只需要:0-9 l d u r &lt; &gt; &lt;space&gt;

另外,有没有关于在 Ruby 中使用正则表达式的好文档,比如带有示例的特殊字符列表?

【问题讨论】:

  • rubular.com 应该正是您想要的。
  • @Michael:我认为这没有帮助,因为正则表达式已经有效。没有按预期工作的是它在这里的应用方式。
  • 我指的是最后一句话。 Rubular 在底部对 Ruby 的正则表达式进行了简洁的解释,并有机会尝试一下。

标签: ruby regex gsub


【解决方案1】:

您拥有的正则表达式已经正常工作。但是,您确实需要将结果分配回您正在操作的字符串。否则,您不会更改字符串(.gsub() 不会就地修改字符串)。

您可以通过添加“+”量词来稍微改进正则表达式(这样可以一次性替换连续的字符)。此外,您不需要转义尖括号:

oneLine = oneLine.gsub(/[^ULDR0-9<>\s]+/i, '')

Jan Goyvaerts 和 Steven Levithan 的 Regular Expressions Cookbook 是一个特别考虑 Ruby 正则表达式的好资源。同一作者的一个很好的在线教程是here

【讨论】:

    【解决方案2】:

    好老的String#delete 不用正则表达式就可以做到这一点。 ^ 表示“不”。

    str = "12eldabc8urp pp"
    p str.delete('^0-9ldur<> ') #=> "12ld8ur "
    

    【讨论】:

      【解决方案3】:

      仅出于完整性考虑:您不需要为此特定任务使用正则表达式,这可以使用 simple string manipulation 来完成:

      irb(main):005:0> "asdasd123".tr('^ULDRuldr0-9<>\t\r\n ', '')
      => "dd123"
      

      如果要替换旧值,还有tr! 方法:

      irb(main):009:0> oneLine = 'UasdL asd 123'
      irb(main):010:0> oneLine.tr!('^ULDRuldr0-9<>\t\r\n ', '')
      irb(main):011:0> oneLine
      => "UdL d 123"
      

      这也应该更快一些(但在 Ruby 中性能不应该是一个大问题:)

      【讨论】:

      • d 应该保留在字符串中。有没有办法让.tr() 不区分大小写?
      • @TimPietzcker:是的,我刚刚注意到.. 除了硬编码两个版本的角色之外,我认为没有内置方法。
      • “但性能在 Ruby 中不应该是一个大问题”——只是好奇你为什么这么说?是因为 ruby​​ 通常不用于高性能应用程序吗?
      • @Steven:在任何编程语言中,在同一问题的不同解决方案之间,我通常会选择最简单的而不是性能最好的,除非我已经证明了这一点一段代码实际上是我的应用程序中的一个瓶颈,确实需要优化。对于像 Ruby 这样的动态语言尤其如此,它们专门设计为“高效”且编写简洁。
      • niklas,可以理解,我同意。我只是想澄清一下 ruby​​ 是否只是性能较慢的代名词。
      猜你喜欢
      • 2018-07-15
      • 2014-03-26
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多