次のテキストを有効にする正規表現があります
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()))