C# 如何查看regex索引在不成功的匹配中进行了多远

C# 如何查看regex索引在不成功的匹配中进行了多远,c#,.net,regex,C#,.net,Regex,可能重复: 如果我有这个题目: 0123456789abcdef... 我有图案 \d+TEST 显然,它将失败。现在我想知道达到的最大索引。换言之,正则表达式引擎将执行以下操作: 首先,它匹配一个数字,因此它将其索引移动到下一个字符,该字符也是一个数字。重复此步骤,直到正则表达式引擎找到编号9。因为下一个字符不是T,所以失败我想获取索引10,因为正则表达式引擎成功地移动了10个字符,直到失败。有办法获取此信息吗?我必须检查几个文件的副本权限,我用正则表达式来做。如果我能知道正则表达式失败

可能重复:

如果我有这个题目:

0123456789abcdef...
我有图案

\d+TEST
显然,它将失败。现在我想知道达到的最大索引。换言之,正则表达式引擎将执行以下操作:


首先,它匹配一个数字,因此它将其索引移动到下一个字符,该字符也是一个数字。重复此步骤,直到正则表达式引擎找到编号
9
。因为下一个字符不是
T
,所以失败我想获取索引
10
,因为正则表达式引擎成功地移动了10个字符,直到失败。
有办法获取此信息吗?我必须检查几个文件的副本权限,我用正则表达式来做。如果我能知道正则表达式失败的索引,那就太好了

您可以迭代执行此操作:

check for pattern \d+T
...then for patter \d+TE
....then for pattern \d+TES   and so on ...this way you can figure out how far you reached

您需要进行两次单独的搜索

在您的示例代码中,regex引擎实际上已经到达了字符串的末尾-引擎本身在拒绝字符串时会考虑所有可能的匹配,因为没有匹配项。您无法获得“我移动到第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”字符串成为可选匹配。然后,您可以查看匹配列表,其中将包括仅数字上的匹配和数字+测试字符串上的匹配

string source = @"0123456789abcdef";
Regex r = new Regex(@"\d+(TEST)?")
MatchCollection matches = r.Matches(source); // Returns one match of 10 digits at position 0 - 10.

如果问题是一般性的,就我所知,对于任何模式来说,都没有简单的方法。对于您的具体情况,您可以简单地匹配
\d+
\d+(测试)?
,但我想这太简单了。谢谢,我将投票删除此问题。抱歉[如果你知道你在寻找什么,这个答案应该会给你一个解决方案][1][1]:@NikolaAnusev我相信\d+会匹配任何数字。如果您看到问题,请将主题指定为:123456789abcd。你能解释一下你所看到的问题吗?正则表达式比
\d+TEST长得多,它有10行长。。。如果正则表达式从索引10到最后一个,那么我想知道,从c#我添加了一些代码,我相信这些代码会返回您要查找的值。