Как удалить символы из текста без слов?

Я хочу, чтобы "This Is A 101 Test" был "This Is A Test", но я не могу правильно получить синтаксис.

src = 'This Is A 101 Test'
puts "A) " + src                       # base => "This Is A 101 Test"
puts "B) " + src[/([a-z]+)/]           # only does first word => "his"
puts "C) " + src.gsub!(/\D/, "")       # Does digits, I want alphabetic => "101"
puts "D) " + src.gsub!(/\W///g)        # Nothing. => ""
puts "E) " + src.gsub(/(\W|\d)/, "")   # Nothing. => ""

Ответы

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

Ответ 2

Чтобы удалить все "символы без слова", вы можете сохранить только те.

src = 'This Is A 101 Test'
src.gsub(/[^a-zA-Z ]/,'').gsub(/ +/,' ')
=> "This Is A Test"

Я рекомендую Rubular для проверки регулярных выражений Ruby.

Ответ 3

Нет regexp:

src = 'This Is A 101 Test'
src.delete('^a-zA-Z ') #the ^ negates everything

Ответ 4

Вы хотите вырезать "101" из строки? Здесь ваше регулярное выражение

src = 'This Is A 101 Test'

puts src.gsub /\ \d+/, ''
# => This Is A Test

Также я не понимаю, почему вы используете bang-версию gsub. gsub! изменяет исходную строку, gsub копирует ее и изменяет копию.

Ответ 5

Вы просто хотите удалить цифры? Если это так, src.gsub(/\d/,"") должен работать. Причина, по которой он не работает выше, заключается в том, что gsub! изменяет строку, на которую он вызывается, поэтому после C, src= "101" и удаления всех цифр оставляет пустую строку.

Если вы хотите исключить все, кроме буквенных символов и пробелов (т.е. цифры и знаки препинания), src.gsub(/(?=\S)(\d|\W)/,"") должен работать.

Если вы хотите исключить все, кроме буквенных символов (исключая пробелы, а также цифры и знаки препинания), src.gsub(/\d|\W/,"") должен работать.