В чем разница между tr и gsub?

Я читал документацию Ruby и путался с разницей между gsub и tr. В чем разница между двумя?

Ответ 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"

Ответ 2

  • tr может заменить только один символ одним фиксированным символом (хотя вы можете поместить несколько совпадений этого типа в один вызов tr), но быстро.
  • gsub может соответствовать сложным шаблонам с использованием regex и заменять сложным результатом вычисления, но медленнее, чем tr.

Ответ 3

tr возвращает копию str с символами в from_str, замененными соответствующими символами в to_str. Если to_str короче from_str, он заполняется его последним символом, чтобы поддерживать соответствие. http://apidock.com/ruby/String/tr

gsub возвращает копию str со всеми вхождениями шаблона, заменяемыми вторым аргументом. Шаблон обычно представляет собой Regexp; если задано как String, любые метасимволы регулярного выражения, которые он содержит, будут интерпретироваться буквально, например. \d будет соответствовать обратному результату, а затем d вместо цифры. http://apidock.com/ruby/String/gsub