Ответ 1
Прежде всего, вы должны быть осторожны с 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