.NET正则表达式 - 如何获得匹配计数?

时间:2011-03-15 01:49:42

标签: .net regex

我有一个突出显示文字的程序。突出显示的术语由我们的用户定义。他们可以使用'*'字符在术语的开头或结尾指定通配符。最后,用户正在寻找我们也为他们提供每个学期的点击次数。

为了简单起见,我们假设我只给了两个词:正义和*。该程序将运行一些看起来像这样的正则表达式:

{(?:nocapture^|[^\p{L}\p{N}']|\b)((justice)|(just[\S]*))(?:nocapture$|[^\p{L}\p{N}']|\b)}

让我们假设这个用户想突出显示的文本块是这样的:

This is justice!

虽然它正确地找到了“正义”这个词,但我只是在捕获组中获得了“正义”。它与“just [\ S] *”与捕获组不匹配。

那么,有没有办法编写正则表达式(或使用.NET选项)来强制引擎尝试对每个由OR分隔的捕获组运行匹配?或者,当它们被OR分开时,它是否总是只使用最左边的捕获组?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果两者都匹配,它总是第一个出现的顺序。当然,如果匹配一个模式导致匹配在后续位置失败,则引擎将回溯并尝试匹配捕获组中的其他模式。

如果您考虑一下,当引擎看到一个具有多个匹配模式的捕获组时, 选择其中一个以某种方式作为“暂定的正确结果” “在尝试匹配表达式的其余部分之前。不知何故,“最左边是首选”。

答案 1 :(得分:0)

如果不必使用OR检查组中的每个选项,则正则表达式引擎更快。只要组中的一个选项为真(从左到右阅读),整个组就为真。

这就像你有条件陈述一样:

int num = 2;

// has to check both values
if(num == 1 || num == 2) { /* stuff */ }

// only has to check the first one, can skip over the second compare for speed
if(num == 2 || num == 3) { /* stuff */ }

// has to check both values
if(num == 3 || num == 4) { /* stuff */ }

所以,回答你的问题,据我所知,不,没有办法。但是你为什么要强制执行呢?