1

テキスト内の文字列「WfooXbarYbazZ」を検索したい。W、X、Y、Zは重要でない区切り文字であり、検索してはなりません。foo、bar、bazは私が興味を持っている単語です。順序はそれほど重要ではありません。必要な単語がテキストでどのように「良い」か知りたいです。

私は次のことを試みています

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

私の推論は次のとおりです。

  • 各単語をオプションのグループにパックするので、発生する必要はありません[(?:はキャプチャされないグループであり、\ Q ...\Eはエスケープするだけです]
  • 各単語を。{0,3}で区切ります(任意の文字、0〜3回出現)

この正規表現はオプションのグループのみで構成されているため常に一致しますが、すべてのオプションのグループに完全に一致する可能性がある場合でも、結果の一致は常に空になります。ただし、結果の一致を後処理したいので、可能な限りキャプチャする必要があります。

正規表現に可能な限りすべてのグループの一致を試行させることはできますか?

または、何かで区切られた複数の単語の検索を実行し、後でどの単語が発生したかをチェックして類似性を計算する方法を知っていますか?

どうもありがとうございます

4

2 に答える 2

5

正規表現を使用するだけでは、問題に取り組むのが難しいと思います。

パーサーコンビネーターという名前の強力なScala機能をご覧になることをお勧めします。

これを使用すると、内部要素を照合するための正規表現の使用と、それらを見つけるための解析戦略を組み合わせることができる必要があります。

これは、このパーサーコンビネーターに関する関連情報を見つけることができる明確できちんとした投稿です。

できることは、コンテンツを次のように表示することです。

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

私の2c

于 2012-01-03T21:37:15.187 に答える
2

これを最初に推測すると、このような正規表現を試してみます

(foo|bar|baz|anyothercombination)

次に、matchescountプロパティを使用します

(スニペットが必要な場合は、これを調べて返信する必要があります)

于 2012-01-03T21:40:32.027 に答える