Я пытаюсь удалить не-буквы из строки. Будет ли это делать:
c = o.replace(o.gsub!(/\W+/, ''))
Я пытаюсь удалить не-буквы из строки. Будет ли это делать:
c = o.replace(o.gsub!(/\W+/, ''))
Просто gsub!
достаточно:
o.gsub!(/\W+/, '')
Обратите внимание, что gsub!
изменяет исходный объект o
. Кроме того, если o
не содержит символов, отличных от слова, результат будет nil
, поэтому использование возвращаемого значения в качестве измененной строки ненадежно.
Вероятно, вы захотите этого:
c = o.gsub(/\W+/, '')
Удалите все, что не является буквой:
> " sd 190i.2912390123.aaabbcd".gsub(/[^a-zA-Z]/, '')
"sdiaaabbcd"
EDIT: как указывает икегами, это не учитывает ударные символы, умлауты и другие подобные персонажи. Решение этой проблемы будет зависеть от того, что именно вы называете "не буквой". Кроме того, каким будет ваш вход.
Это будет работать в большинстве случаев, за исключением случаев, когда o
изначально не содержит никаких букв, и в этом случае gsub!
вернет nil
.
Если вы просто хотите заменить строку, это может быть проще:
c = o.gsub(/\W+/, '')
Использование \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, поэтому, если у вас есть многобайтовые символы, вы, вероятно, должны использовать это.
Имейте в виду, что ruby считает символ подчеркивания _
символом слова. Поэтому, если вы хотите также подчеркнуть подчеркивание, это должно сделать это
string.gsub!(/\W+/, '')
В противном случае вам нужно сделать это:
string.gsub!(/[^a-zA-Z]/, '')
Я не вижу, что там есть o.replace
, если у вас есть строка:
string = 't = 4 6 ^'
И вы делаете:
string.gsub!(/\W+/, '')
Вы получаете:
t46
Если вы хотите избавиться от символов числа, вы можете сделать:
string.gsub!(/\W+|\d+/, '')
И вы получите:
t
использовать объединение Regexp # для создания большого объекта соответствия
allowed = Regexp.union(/[a-zA-Z0-9]/, " ", "-", ":", ")", "(", ".")
cleanstring = dirty_string.chars.select {|c| c =~ allowed}.join("")