0

私は現在、正規表現を使用して文字列に対して一連の処理を行っていますが、gsub()それらをかなり重くチェーンしているため、面倒になり始めています。次の単一の正規表現を作成するのを手伝ってもらえますか:

string.gsub(/\.com/,'').gsub(/\./,'').gsub(/&/,'and').gsub(' ','-').gsub("'",'').gsub(",",'').gsub(":",'').gsub("#39;",'').gsub("*",'').gsub("amp;",'')

基本的に、上記は以下を削除します。

  • .com
  • .
  • :
  • *
  • 「and」を「&」に切り替える
  • '-' の代わりに ' ' を切り替えます
  • '' を '' に切り替える

これを行う簡単な方法はありますか?

4

3 に答える 3

3

文字を削除するものを組み合わせることができます:

string.gsub(/\.com|[.,:*]/,'')

パイプ|は「または」を意味します。or の右側は文字クラスです。「これらの文字の 1 つ」を意味します。

于 2011-02-16T22:12:34.160 に答える
1

オプションを追加すると、変換テーブルはよりスケーラブルになります。

translations = Hash.new
translations['.com'] = ''
translations['&'] = 'and'
...

translations.each{ |from, to| string.gsub from, to }
于 2011-02-16T22:18:40.583 に答える
0

ティムの答えに基づいて:

にブロックを渡すことができるString.gsubので、必要に応じてそれらをすべて組み合わせることができます。

string.gsub(/\.com|[.,:*& ']/) do |sub|
    case(sub)
    when '&'
        'and'
    when ' '
        '-'
    else
        ''
    end
end

または、エコーバックの答えを構築して、ブロックで変換ハッシュを使用できます (これをtranslations.default = ''機能させるために呼び出す必要がある場合があります)。

string.gsub(/\.com|[.,:*& ']/) {|sub| translations[sub]}

ブロックを使用する最大のメリットは、呼び出しが 1 つだけであることですgsub(史上最速の関数ではありません)。

お役に立てれば!

于 2011-02-16T22:28:22.343 に答える