1

正規表現の配列と文字列の配列があります。配列のサイズは任意の長さにすることができます(たとえば、100または1000)。2つの異なる正規表現に一致する文字列はありません。どのように実施するかはわかりませんが、そこにあると仮定しましょう。正規表現は、で始まりpre、オプションのコロン、1つ以上のスペース、特定の文字列、単一のスペース、整数の順に続きます。大文字と小文字は区別されません。

regexes = [/pre: my_string (\d+)/i, /pre: another (\d+)/i]
strings = ["comet", "eclipse", "sunshine", "starlight", "moonlight"]

文字列ごとに、一致する正規表現を確認し、対応する一致を返します。上記のサンプルコードは、私の現在のアプローチを示しています。

strings.each {|string|
  regexes.each {|regex|
    if regex.match(string)
      p regex.match(string)
      break
    end
  }
}

非効率のようです。これを実装するためのより効率的な方法は何ですか?

4

2 に答える 2

1

正規表現の配列を使用しないでください。代わりに、検索ツリーを使用してください。

ここに素晴らしい紹介記事があります:文字列をソートおよび検索するための高速アルゴリズム。

または、手っ取り早い解決策が必要な場合は、Ruby Regexp#unionを使用してregexpsを融合し、1つの大きなソリューションを作成できます。これにより、一致する文字列がない場合の検出がより効率的になり、ベンチマークを行うことができます。一致する場合は、一致位置を使用して、どの正規表現が一致したかを判断します。

(#unionメソッドの「muは短すぎます」からのコメントに感謝します)

あなたが説明するあなたの特定のケースでは、すべての正規表現が「pre」とオプションのコロンなどで始まる場合、/pre:?を実行できます。+(star | moon | sun)/そして、一致した結果を使用して、一致したものを見つけます。

Rubyの正規表現は検索ツリーを使用して実装されます。ここにあなたにリードを与えるかもしれない興味深い説明があります:

于 2012-10-03T04:21:11.507 に答える
1

Regexp.union()の例を含めるだけです

desired = Regexp.union(/RM/, /dog/, /hat/)
x = "RM20"
y = "phat"
puts "rawr!" if y =~ desired
#=> rawr!
puts "match!" if x =~ desired
#=> match
于 2013-08-27T19:36:55.050 に答える