您需要进行两次单独的搜索。
在您的示例代码中,正则表达式引擎实际上已经到达字符串的末尾 - 当拒绝字符串时,引擎本身会考虑所有可能的匹配项。您无法获得“我移至第 10 个字符并停止”的信息,因为正则表达式引擎实际上在最终完成之前移至第 16 个字符。
对于您的要求,您首先要执行以下操作:
string source = @"0123456789abcdef";
Regex r = new Regex(@"\d+TEST")
MatchCollection matches = r.Matches(source); // Returns no matches
这将返回您的完整字符串是否存在匹配项。如果失败,则执行以下命令:
if (matches.Count == 0) {
r = new Regex(@"\d+");
MatchCollection matches = r.Matches(source);
int maxpos = -1;
foreach (Match m in matches) {
if (m.Index + m.Length > maxpos) maxpos = m.Index + m.Length;
}
// returns 10
return maxpos;
}
编辑:另一种选择是使“TEST”字符串成为可选匹配。然后,您可以查看匹配列表,其中将包括仅在数字上的匹配和在数字 + TEST 字符串上的匹配。
string source = @"0123456789abcdef";
Regex r = new Regex(@"\d+(TEST)?")
MatchCollection matches = r.Matches(source); // Returns one match of 10 digits at position 0 - 10.