1

次のテキストを有効にする正規表現があります

alpha beta + gamma delta - epsilon phi

の中へ

<ref4> + <ref45> - <ref11>

参照は内部 ID です。次のコードから正規表現を作成します

EncodeRegex = new Regex("\b(?<nom>" + // word boundary
String.Join("|", Things.Select(t => Regex.Escape(t.Name)).ToArray()) + 
")\b", // word boundary
RegexOptions.IgnoreCase);

上記のテキストの例は次のとおりです。

\b(alpha\ beta|gamma\ delta|epsilon\ phi)\b

ここで、「alpha beta」と co は、認識しなければならないテキスト ブロックです。次に、テキスト ブロックの値をカスタムの MatchEvaluator での参照に置き換えます。

しかし、問題があります。2 つのテキスト ブロック A と B があり、A が B のプレフィックスである場合、正規表現は A と B の順序に依存します。 \b(alpha|alpha\ beta)\bアルファが評価されるとすぐに、ベータが続いたとしても停止します。

テキスト ブロックを長さの降順で並べ替える以外に、可能な限り長いテキスト ブロックに常に一致するように正規表現を指示する方法はありますか?


@Anirudh: 次のコードを使用します

EncodeRegex.Replace(s, new MatchEvaluator(m => Things.Where(Function(r) r.Name.ToUpper() == m.Groups("nom").Value.ToUpper()).Select(Function(r) "<" & r.Reference & ">").FirstOrDefault()))
4

2 に答える 2

0

どのパターンも別のパターンのサフィックスではない場合は、右から左へのマッチングを試してみてください。詳細については、msdn のチュートリアルリファレンスを参照してください。

別の方法は、一致式から一般的な部分式を除外することです。

\b(alpha(\ beta)?\b

ps: エンジンはデフォルトで貪欲に一致するはずなので、コードをもう一度確認してください。

于 2013-06-27T15:13:26.820 に答える