tr和gsub有什么区别?


133

我读了Ruby文档和与得到之间的区别感到困惑gsubtr。两者有什么区别?


8
我找到了这个问题,是因为RuboCop提醒我使用gsub -我认为下面的答案很好地解释了答案,这基本上就是gsub和tr之间的区别。
JohnK,2015年

Answers:


180

tr时要替换(翻译)单个字符。

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

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

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

使用gsub时,你需要使用正则表达式或当你想更换更长的字符串:

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

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

48
上下文:名称的tr意思是“翻译”,就像“翻译字符”一样,就是它的作用。它以同名的Unix实用程序命名(以其晦涩和简短的名称而闻名)。
马丁·图尔诺伊

40
  • tr 只能用单个固定字符替换单个字符(尽管您可以将多个此类匹配项放在一个 tr调用中),但速度很快。
  • gsub可以使用regex匹配复杂的模式,并替换为复杂的计算结果,但速度慢于tr

9
没错 当两者tr都比速度快几倍时gsub。下面是关于如何快速基准tr可以比gsubgithub.com/JuanitoFatas/fast-ruby/blob/master/code/string/...
JackXu

9

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.