2012-01-03 7 views
1

テキスト内に「W foo X bar Y baz Z」という文字列を検索したいとします。 W、X、Y、Zは重要ではないセパレータであり、それらを検索してはいけません。 foo、bar、bazが私が興味を持っている言葉です。その順序はそれほど重要ではありません。 私はテキストの中に私の必要な言葉がどのように「良い」かを知りたい。正規表現を強制的に任意のグループに一致させる

  • パックオプションのグループ内の各単語、それは を[(発生することが必要とされていません:

    私は、次の

    (?:\Qfoo\E)?.{0,3}(?:\Qbar\E)?.{0,3}(?:\Qbaz\E)? 
    

    私の推論をしようとしていることはありますか?非です\ Q ... \ Eはエスケープしています]

  • 。{0,3}(各文字は0-3回発生)

この正規表現は、オプションのグループのみで構成されているため常に一致しますが、は一致していますが、すべてのオプショングループと完全に一致していても一致するものは常にです。 しかし、結果のマッチを後処理したいので、できるだけキャプチャする必要があります。

Regexにすべてのグループを可能な限り一致させるように強制できますか?

また、いくつかの単語の検索を何らかの方法で行い、後でどちらの単語が類似点を計算するのかを確認する方法はありますか?

は、私はあなたが単純に正規表現を使用して問題に取り組むためのいくつかの困難を持っていると思う非常に

+0

まあ、問題があります。まず、法的入力は何ですか?あなたの "必須の単語"はすべてオプションで、 '。{0,3}'を2回使うとパターンは '' 1bar2 "'を含む6文字にマッチします。 )。すべてのグループは本当にオプションですか?セパレータをよりよく定義できますか?まず、セパレータとその前のグループの間のリンクを作成することから始めます。たとえば、 '(?:foo。{0,3})?(?:bar。{0,3})?(?: baz )?'あなたが明確にしてもっと多くの例を挙げることができるなら、もっとうまくいくことができます。 – Kobi

+0

'? 'マッチングのためにどのような正規表現方法を使用しますか? – fge

答えて

5

、ありがとうございました。

パーザーコンビネータの名前を付ける強力なScala機能を紹介することをお勧めします。

これを使用すると、内部要素の一致に正規表現を使用し、それを見つけるためのパースストラテジを組み合わせる必要があります。

ここには、Parser Combinatorに関する関連情報が記載されています。何ができるか

は、私はこの

(foo|bar|baz|anyothercombination) 

のような正規表現を試してみて、その後、使用することになり

delim = "[a-z]{0,3}".r 
value = "foo|bar|baz".r 
expr = delim ~ value ~ expr 

としてこれで私の2cを

+0

私はパーサーコンビネータを認識していますが、私の問題と一致するかどうかは不明ですが、それを試してみます。ありがとう – hotzen

2

最初の推測をあなたのコンテンツを見ることですcountプロパティに一致します

(これを調べて、あなたに戻ってくる必要がありますあなたにスニペットをお願いします)

関連する問題