Как я могу удалить не текстовые символы из текста? - PullRequest
15 голосов
/ 02 февраля 2012

Я хочу, чтобы «Это тест 101» был «Это тест», но я не могу понять синтаксис правильно.

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. => ""

Ответы [ 5 ]

27 голосов
/ 02 февраля 2012

Прежде всего, вы должны быть осторожны с 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
8 голосов
/ 02 февраля 2012

Нет регулярных выражений:

src = 'This Is A 101 Test'
src.delete('^a-zA-Z ') #the ^ negates everything
8 голосов
/ 02 февраля 2012

Чтобы удалить все «несловные символы», вы можете оставить только те.

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

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

4 голосов
/ 02 февраля 2012

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

src = 'This Is A 101 Test'

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

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

3 голосов
/ 02 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...