Удаление всех специальных символов из строки — ruby

Я выполнял задачи из pythonchallenge и писал код на ruby, конкретно этот. Он содержит очень длинную строку в исходном коде страницы со специальными символами. Я пытался найти способ удалить их/проверить алфавитные символы.

Я пытался использовать метод сканирования, но думаю, что могу использовать его неправильно. Я также пробовал delete! так:

    a = "PAGE SOURCE CODE PASTED HERE"
    a.delete! "!", "@"  #and so on with special chars, does not work(?) 
    a

Как я могу это сделать?

Спасибо


person kwoskowicz    schedule 30.01.2014    source источник


Ответы (6)


Ты можешь это сделать

a.gsub!(/[^0-9A-Za-z]/, '')
person Alok Anand    schedule 30.01.2014

попробуй с gsub

a.gsub!(/[!@%&"]/,'')

попробуйте регулярное выражение на rubular.com

если вы хотите что-то более общее, вы можете иметь строку с допустимыми символами и удалить то, чего там нет:

a.gsub!(/[^abcdefghijklmnopqrstuvwxyz ]/,'')
person arieljuod    schedule 30.01.2014
comment
Я думаю, что в данном случае [^A-Za-z ] работает лучше. В противном случае, если у вас есть предложение, которое обычно должно начинаться с заглавной буквы, вы потеряете заглавные буквы. Вы также потеряете любые 1337 speak или другие возможные крипты в тексте. Показательный пример: phrase = "Joe can't tell between 'large' and large." => "Joe can't tell between 'large' and large." - person ThaDick; 11.05.2017

Когда вы указываете несколько аргументов для string#delete , удаляется пересечение этих аргументов. a.delete! "!", "@" удаляет пересечения множеств ! и @, что означает, что ничего не будет удалено, и метод возвращает nil.

То, что вы хотели сделать, это a.delete! "!@" с символами для удаления, переданными как одна строка.

Поскольку задача состоит в том, чтобы убрать беспорядок и найти в нем сообщение, я бы выбрал белый список вместо удаления специальных символов. Метод удаления принимает диапазоны с - и отрицания с ^ (аналогично регулярному выражению), поэтому вы можете сделать что-то вроде этого: a.delete! "^A-Za-z ".

Вы также можете использовать регулярные выражения, как показано @arieljuod.

person dee-see    schedule 30.01.2014

gsub — один из наиболее часто используемых методов Ruby.

specialname="Hello!#$@"
cleanedname = specialname.gsub(/[^a-zA-Z0-9\-]/,"") 
person Pradeep    schedule 30.01.2014

Я думаю, что a.gsub(/[^A-Za-z0-9 ]/, '') работает лучше в этом случае. В противном случае, если у вас есть предложение, которое обычно должно начинаться с заглавной буквы, вы потеряете заглавную букву. Вы также потеряете любые 1337 speak или другие возможные крипты в тексте.

Дело в точке:

phrase = "Joe can't tell between 'large' and large." => "Joe can't tell between 'large' and large."

phrase.gsub(/[^a-z ]/, '') => "oe cant tell between large and large"

phrase.gsub(/[^A-Za-z0-9 ]/, '') => "Joe cant tell between large and large"

phrase2 = "W3 a11 f10a7 d0wn h3r3!" phrase2.gsub(/[^a-z ]/, '') => " a fa dwn hr"

phrase2.gsub(/[^A-Za-z0-9 ]/, '') => "W3 a11 f10a7 d0wn h3r3"

person ThaDick    schedule 11.05.2017

Если вы не хотите менять исходную строку, т.е. решать задачу.

str.each_char do |letter|
  if letter =~ /[a-z]/  
    p letter    
  end  
end  
person AGS    schedule 30.01.2014