У меня есть регулярное выражение, которое превращает следующий текстИспользуя жадный подход в последовательности слов регулярное выражение
alpha beta + gamma delta - epsilon phi
в
<ref4> + <ref45> - <ref11>
с эталонами быть внутренними идентификаторами. Я строй регулярного выражения из следующего кода
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
где «альфа-бета» и совместно являются текстовыми блоками, которые я должен признать. Затем я заменяю значения текстовых блоков своими ссылками с помощью специального MatchEvaluator.
У меня проблема; если у меня есть два текстовых блока A и B, где A - префикс B, регулярное выражение зависит от порядка A и B. \b(alpha|alpha\ beta)\b
остановится, как только будет оценен Alpha, даже если за ним последует Beta.
Помимо заказа текстовых блоков по нисходящей длине, существует ли способ сказать регулярное выражение всегда соответствовать более длинному текстовому блоку?
@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()))
и какой код вы используете, чтобы заменить его. – Anirudha
отредактирован для добавления кода замены – samy