1

ユーザーがアイテムのリストをすばやくフィルター処理するための小さなフィルター ユーティリティを作成しています。できれば正規表現を使用して、単語の先頭を順番に一致させたいと考えています。

というラベルの付いたアイテムを見つけようとしているユーザーを考えてみましょうhere is some text

  • 任意の単語の先頭に一致させる方法はすでに知っています。

herher e is some text — \bher
so — here is so me text —\bso
内線一致しない\bext

  • そして、いくつかの単語の最初の文字と一致させる方法を知っています:

hist —ここにいくつのテキストがありますhtここにいくつかのテキストあります\bh.*?\bi.*?\bs.*?\bt
\bh.*?\bt

  • 私が必要としているのは、nいくつかの単語の最初の文字を一致させる機能です。

hersther e is some text ext iso — here i s so me text teh —一致しない

私がこれを行っているのは、私のアイテムには初期化が含まれていることが多く、ユーザーがuscと入力して、 US A、Californiaをすばやく取得しようとする可能性があるためです。

入力ごとにパターンを書き直しているので、ケース 2 で必要なように、少し作業を行うことができます。パターンの複雑さまたは全体の複雑さのいずれかで、文字数に比例してスケーリングするソリューションを探しています。

これらの制約を考えると、これらの文字列を一致させるための最良のオプションは何ですか?

4

4 に答える 4

2

これは、標準の正規表現ライブラリでは実行できないと思います。

ただし、制約があれば、独自のパーサーを作成してマッチングを行うことができるはずです。パターンのスタックを保持し、入力テキストを最初から最後までスキャンします。追跡する必要がある唯一の状態は、前のキャラクターが境界であったか、スタックからアイテムを取り出したかどうかです。スタックを空にせずに入力の終わりに到達した場合、それは不一致でした。

擬似コード:

pattern = "herst"
input = "here is some text"
state = true
until input.empty? or pattern.empty? do
  if input[0] == pattern[0] and state
    pattern.shift!
  else
    state = is_boundary(input[0])
  endif
  input.shift!
done
return pattern.empty?
于 2012-06-11T20:55:44.593 に答える
1

次のような怪物:

 \bh(.*?\b)?e(.*?\b)?r(.*?\b)?s(.*?\b)?t

基本的に、すべての文字の前に前の文字が続くか、単語の境界で終わるランダムなシーケンスのいずれか(.*?\b)です。したがって、このランダムなシーケンス + \b を でオプションにし?ます。(.*?\b)?したがって、すべての文字の間で分割するとうまくいくはずです。

于 2012-06-11T20:56:21.490 に答える
0

純粋な正規表現を使用してこれを柔軟に行うことは、不可能ではないにしても、困難です。私が思いつく1つの可能なアプローチは、最初にすでに行ったように単語の境界を使用して単純な正規表現の一致を試み、次にすべての可能な接頭辞と接尾辞のペアのセットを生成してそれらと一致させることです。ただし、文字列内の2つ以上の個別の単語と任意に照合できるようにする場合は、検索対象の文字列をウォークスルーして、クエリ文字列の最長のプレフィックスと照合する簡単な関数を作成する必要があります。その最長のプレフィックスを見つけたら、検索文字列内の次の単語に移動し、クエリの残りの部分(つまり、すでに一致したプレフィックスを差し引いたもの)との照合を試み、クエリ全体が完了するまでこれを続行します一致している、または、検索された文字列が終了します。これは、再帰的に実装するのはかなり簡単なはずです。

于 2012-06-11T21:04:00.540 に答える
-2

^<myregex>文字列の先頭と<myregex>$末尾に使用してみてください。

于 2012-06-11T20:52:47.673 に答える