Изтриване на всички специални символи от низ - 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!(/[!@%&"]/,'')

опитайте regexp на 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