Регулярное выражение для удаления букв

Я пытаюсь удалить не-буквы из строки. Будет ли это делать:

c = o.replace(o.gsub!(/\W+/, ''))

Ответ 1

Просто gsub! достаточно:

o.gsub!(/\W+/, '')

Обратите внимание, что gsub! изменяет исходный объект o. Кроме того, если o не содержит символов, отличных от слова, результат будет nil, поэтому использование возвращаемого значения в качестве измененной строки ненадежно.

Вероятно, вы захотите этого:

c = o.gsub(/\W+/, '')

Ответ 2

Удалите все, что не является буквой:

> " sd  190i.2912390123.aaabbcd".gsub(/[^a-zA-Z]/, '')
"sdiaaabbcd"

EDIT: как указывает икегами, это не учитывает ударные символы, умлауты и другие подобные персонажи. Решение этой проблемы будет зависеть от того, что именно вы называете "не буквой". Кроме того, каким будет ваш вход.

Ответ 3

Это будет работать в большинстве случаев, за исключением случаев, когда o изначально не содержит никаких букв, и в этом случае gsub! вернет nil.

Если вы просто хотите заменить строку, это может быть проще:

c = o.gsub(/\W+/, '')

Ответ 4

Использование \W или \W для выбора или удаления только символов не будет работать. \W означает A-Z, a-z, 0-9 и "_":

irb(main):002:0> characters = (' ' .. "\x7e").to_a.join('')
=> " !\"\#$%&'()*+,-./0123456789:;<=>[email protected][\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
irb(main):003:0> characters.gsub(/\W+/, '')
=> "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"

Итак, удаление с помощью \W сохраняет цифры и символы подчеркивания.

Если вы хотите совместить символы, используйте /[A-Za-z]+/ или класс символов POSIX [:alpha:], т.е. /[[:alpha:]]+/ или /\p{ALPHA}/.

Конечный формат - это свойство Unicode для 'A'.. 'Z' + 'a'.. 'z' в ASCII и расширяется при работе с Unicode, поэтому, если у вас есть многобайтовые символы, вы, вероятно, должны использовать это.

Ответ 5

Имейте в виду, что ruby ​​считает символ подчеркивания _ символом слова. Поэтому, если вы хотите также подчеркнуть подчеркивание, это должно сделать это

string.gsub!(/\W+/, '')

В противном случае вам нужно сделать это:

string.gsub!(/[^a-zA-Z]/, '')

Ответ 6

Я не вижу, что там есть o.replace, если у вас есть строка:

string = 't = 4 6 ^'

И вы делаете:

string.gsub!(/\W+/, '')

Вы получаете:

t46

Если вы хотите избавиться от символов числа, вы можете сделать:

string.gsub!(/\W+|\d+/, '')

И вы получите:

t

Ответ 7

использовать объединение Regexp # для создания большого объекта соответствия

allowed = Regexp.union(/[a-zA-Z0-9]/, " ", "-", ":", ")", "(", ".")
cleanstring = dirty_string.chars.select {|c| c =~ allowed}.join("")