Прежде всего, вы должны быть осторожны с gsub
и gsub!
.Последний "опасен!"и изменит значение src
.Если вы выполняете эти операторы по порядку, имейте в виду, что a.gsub!(/a/, "b")
и a = a.gsub(/a/, "b")
будут делать то же самое с a
.Часть проблемы с вашим кодом заключается в том, что src
изменяется.
Метод B возвращает "his"
, но не вносит изменений в source
src[/([a-z]+)/] # => "his"
src # => "This Is A 101 Test"
Метод C удаляетвсе символы, которые не являются числами:
src.gsub!(/\D/, "") # => "101"
src # => "101"
Метод D не работает из-за неправильного синтаксиса.Метод gsub
принимает регулярное выражение / строку для поиска и затем строку для замены.Если вы попробуете его в IRB, он будет действовать так, как будто вам нужен еще один /
.
Метод E заменяет все несловарные символы и все числа:
src.gsub(/(\W|\d)/, "") # => "This Is A Test" (note the two spaces)
src # => "This Is A 101 Test"
Вы указываетечто он возвращается ""
.Что на самом деле происходит, так это то, что C и D в списке (с исправленными синтаксическими проблемами) являются деструктивными изменениями.(Кроме того, если запустить на "101"
, D на самом деле вернет nil
, так как никакие замены не были выполнены.) Таким образом, E просто запускается на "101"
, и, поскольку вы заменяете все не слова и все числа с ""
, оно становится "101"
.
Ответ, который вы ищете, будет что-то вроде:
src.gsub!(/\d\s?/, "") # => "This Is A Test"
src # => "This Is A Test"
И мой любимый для общениясо всеми сценариями двойных пробелов (поскольку squeeze
весьма эффективен при объединении одинаковых символов, strip
весьма эффективен при удалении конечных пробелов, и эти !
возвращают nil
, если они не заменяют):
src = src.gsub(/\d+/, "").squeeze(" ").strip