我有一个突出显示文字的程序。突出显示的术语由我们的用户定义。他们可以使用'*'字符在术语的开头或结尾指定通配符。最后,用户正在寻找我们也为他们提供每个学期的点击次数。
为了简单起见,我们假设我只给了两个词:正义和*。该程序将运行一些看起来像这样的正则表达式:
{(?:nocapture^|[^\p{L}\p{N}']|\b)((justice)|(just[\S]*))(?:nocapture$|[^\p{L}\p{N}']|\b)}
让我们假设这个用户想突出显示的文本块是这样的:
This is justice!
虽然它正确地找到了“正义”这个词,但我只是在捕获组中获得了“正义”。它与“just [\ S] *”与捕获组不匹配。
那么,有没有办法编写正则表达式(或使用.NET选项)来强制引擎尝试对每个由OR分隔的捕获组运行匹配?或者,当它们被OR分开时,它是否总是只使用最左边的捕获组?
谢谢!
答案 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 */ }
所以,回答你的问题,据我所知,不,没有办法。但是你为什么要强制执行呢?