【问题标题】:What is the difference between tr and gsub?tr 和 gsub 有什么区别?
【发布时间】:2015-01-01 03:57:19
【问题描述】:

我在阅读 Ruby 文档时对 gsubtr 之间的区别感到困惑。两者有什么区别?

【问题讨论】:

  • 我发现这个问题是因为 RuboCop 提醒我使用 gsub ——我认为下面的答案很好地解释了答案,这基本上是 gsub 和 tr 之间的区别。

标签: ruby


【解决方案1】:

当您想要替换(翻译)单个字符时,请使用 tr

tr 匹配 单个 个字符(不是通过正则表达式),因此这些字符不需要在第一个字符串参数中以相同的顺序出现。找到一个字符后,将其替换为在第二个字符串参数中的同一索引处找到的字符:

'abcde'.tr('bda', '123')
#=> "31c2e"

'abcde'.tr('bcd', '123')
#=> "a123e"

当您需要使用正则表达式或想要替换较长的子字符串时,请使用gsub

'abcde'.gsub(/bda/, '123')
#=> "abcde"

'abcde'.gsub(/b.d/, '123')
#=> "a123e"

【讨论】:

  • 上下文:tr 这个名字的意思是“翻译”,就像“翻译字符”一样,这正是它的作用。它以同名的 Unix 实用程序命名(以其晦涩和简短的名称而闻名)。
【解决方案2】:

tr 返回str 的副本,其中from_str 中的字符替换为to_str 中的相应字符。如果to_strfrom_str 短,则用最后一个字符填充以保持对应关系。 http://apidock.com/ruby/String/tr

gsub 返回str 的副本,其中所有出现的模式都替换了第二个参数。该模式通常是一个正则表达式;如果作为字符串给出,它包含的任何正则表达式元字符都将按字面意思解释,例如\d 将匹配后跟d 的反冲,而不是数字。 http://apidock.com/ruby/String/gsub

【讨论】:

    【解决方案3】:
    • tr 只能用单个固定字符替换单个字符(尽管您可以在单个 tr 调用中放置多个此类匹配项)但速度很快。
    • gsub 可以使用正则匹配复杂的模式,并替换为复杂的计算结果,但比tr 慢。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    相关资源
    最近更新 更多