web-dev-qa-db-ja.com

文字列からすべての特殊文字を削除する-ruby

私は pythonchallenge Rubyでコードを書く、 具体的にはこれ からチャレンジをしていました。ページソースに特殊文字を含む非常に長い文字列が含まれています。私はそれらを削除する/アルファベット文字をチェックする方法を見つけようとしていました。

スキャン方法を試しましたが、適切に使用できない可能性があります。私も試してみましたdelete!そのような:

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

どうやってやるの?

ありがとう

47
kwoskowicz

あなたはこれを行うことができます

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

gsubで試してください

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

rubular.comで正規表現を試してください

より一般的なものが必要な場合は、有効な文字を含む文字列を使用して、そこにないものを削除できます:

a.gsub!(/[^abcdefghijklmnopqrstuvwxyz ]/,'')
11
arieljuod

string#delete に複数の引数を指定すると、それらの引数の共通部分が削除されます。 a.delete! "!", "@"!@のセットの共通部分を削除します。つまり、何も削除されず、メソッドはnilを返します。

あなたがしたかったのは、削除する文字が単一の文字列として渡されたa.delete! "!@"です。

課題は混乱をクリーンアップしてメッセージを見つけることを求めているため、特殊文字を削除する代わりにホワイトリストを使用します。 deleteメソッドは-の範囲と^の否定(正規表現に似ています)を受け入れるため、次のようなことができます:a.delete! "^A-Za-z "

@arieljuodで示されているように、正規表現を使用することもできます。

6
dee-see

gsubは、最も広く使用されているRubyメソッドの1つです。

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

元の文字列を変更したくない場合-つまり、課題を解決するために。

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

この場合、a.gsub(/[^A-Za-z0-9 ]/, '')の方がうまく機能すると思います。それ以外の場合、通常はshouldで始まる文がある場合、大文字が失われます。また、テキスト内の_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"

1
ThaDick