0

可能重复:
匹配失败的匹配字符串中的正则表达式索引

如果我有主题:

0123456789abcdef...

我有模式

\d+TEST

显然它会失败。现在我想知道达到的最大指数。换句话说,正则表达式引擎会完成:

首先它匹配一个数字,因此它将索引移动到下一个也是数字的字符。将重复此步骤,直到正则表达式引擎找到数字9。因为下一个字符不是 aT它失败。我想获取索引10,因为正则表达式引擎成功移动了 10 个字符,直到失败。有没有办法获取这些信息?我必须检查几个文件的版权,我用正则表达式来做。如果我能知道正则表达式在哪个索引上失败,那就太好了。

4

2 回答 2

0

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

在您的示例代码中,正则表达式引擎实际上已经到达字符串的末尾 - 当拒绝字符串时,引擎本身会考虑所有可能的匹配项。您无法获得“我移至第 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.
于 2012-07-30T17:57:48.430 回答
-1

您可以迭代地执行此操作:

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
于 2012-07-30T17:41:50.500 回答