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 将文本块值替换为它们的引用。

我有一个问题;如果我有两个文本块 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()))
4

2 回答 2

2

描述

根据您的示例文本,您的组之间存在已知的分隔符,因此您可以简单地使用前瞻来验证分隔符,如下面的表达式,这将阻止较短的前缀完成匹配。

正则表达式:(^|[+-]\s)(alpha|alpha\ beta)(?=\s[+-]|$)

用。。。来代替:$1~~~new value~~~

在此处输入图像描述

例子

输入文本

alpha beta + gamma delta - epsilon phi
alpha + alpha beta + gamma delta - epsilon phi

示例代码

Imports System.Text.RegularExpressions
Module Module1
  Sub Main()
    Dim sourcestring as String = "replace with your source string"
    Dim replacementstring as String = "$1~~~new value~~~"
    Dim matchpattern as String = "(^|[+-]\s)(alpha|alpha\ beta)(?=\s[+-]|$)"
    Console.Writeline(regex.Replace(sourcestring,matchpattern,replacementstring,RegexOptions.IgnoreCase OR RegexOptions.Multiline))
  End Sub
End Module

更换后输入

~~~new value~~~ + gamma delta - epsilon phi
~~~new value~~~ + ~~~new value~~~ + gamma delta - epsilon phi
于 2013-06-27T17:58:31.167 回答
0

如果您的模式都不是另一个模式的后缀,您可能希望尝试从右到左匹配,有关详细信息,请参阅 msdn教程参考

另一种方法是从匹配表达式中分解出常见的子表达式,例如

\b(alpha(\ beta)?\b

ps:再次检查您的代码,因为默认情况下引擎应该贪婪地匹配。

于 2013-06-27T15:13:26.820 回答