我有一个正则表达式可以转换以下文本
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 将文本块值替换为它们的引用。
我有一个问题;如果我有两个文本块 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()))