Regex, чтобы удалить не буквы - PullRequest
17 голосов
/ 24 марта 2011

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

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

Ответы [ 7 ]

25 голосов
/ 24 марта 2011

Достаточно gsub!:

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

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

Возможно, вы захотите это вместо:

c = o.gsub(/\W+/, '')
6 голосов
/ 24 марта 2011

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

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

РЕДАКТИРОВАТЬ: как указывает Икегами, это не учитывает акцентированные символы, умлауты и другие подобные символы. Решение этой проблемы будет зависеть от того, что именно вы называете «не буквой». Кроме того, что ваш вклад будет.

3 голосов
/ 24 марта 2011

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

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

c = o.gsub(/\W+/, '')
2 голосов
/ 07 июня 2017

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

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

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

string.gsub!(/[^a-zA-Z]/, '')
2 голосов
/ 24 марта 2011

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

irb(main):002:0> characters = (' ' .. "\x7e").to_a.join('')
=> " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`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, поэтому, если у вас есть многобайтовые символы, вам, вероятно, следует использовать это.

1 голос
/ 03 ноября 2013

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

allowed = Regexp.union(/[a-zA-Z0-9]/, " ", "-", ":", ")", "(", ".")
cleanstring = dirty_string.chars.select {|c| c =~ allowed}.join("")
1 голос
/ 24 марта 2011

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

string = 't = 4 6 ^'

И вы делаете:

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

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

t46

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

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

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

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