.net 正则表达式引擎是否跳过比模式短的字符串?

.net 正则表达式引擎是否跳过比模式短的字符串?,.net,regex,.net,Regex,我想循环一组字符串。在每个字符串上,我想循环一组正则表达式,以确定哪些表达式与我所在的字符串匹配。但是,如果字符串长度小于模式字符串的最大可能长度,我希望正则表达式引擎跳过它 例如,假设我在字符串“abc”上停止 用这个正则表达式测试它 (?i)[A-Z]{3} 而且是匹配的。然后我要测试的下一个表达式是 (?i)[A-Z]+(?=123) 即使第二个案例永远不会匹配,引擎是否仍会从一开始就开始检查字符串 如果是这种情况,有没有办法让它跳过不满足最小长度要求的字符串?当您关注实现细节,并且源

我想循环一组字符串。在每个字符串上,我想循环一组正则表达式,以确定哪些表达式与我所在的字符串匹配。但是,如果字符串长度小于模式字符串的最大可能长度,我希望正则表达式引擎跳过它

例如,假设我在字符串“abc”上停止 用这个正则表达式测试它

(?i)[A-Z]{3}
而且是匹配的。然后我要测试的下一个表达式是

(?i)[A-Z]+(?=123)
即使第二个案例永远不会匹配,引擎是否仍会从一开始就开始检查字符串


如果是这种情况,有没有办法让它跳过不满足最小长度要求的字符串?

当您关注实现细节,并且源代码可用时,最好的方法就是简单地查看它。:)

简单的回答是:不完全是

在.NET正则表达式实现中实现的优化是字符串搜索,尽可能将其作为匹配的第一阶段。看看这本书,看看那些血淋淋的细节

从代码本身来看:

// The RegexBoyerMoore object precomputes the Boyer-Moore
// tables for fast string scanning. These tables allow
// you to scan for the first occurance of a string within
// a large body of text without examining every character.
// The performance of the heuristic depends on the actual
// string and the text being searched, but usually, the longer
// the string that is being searched for, the fewer characters
// need to be examined.
这需要一个锚定前缀,由搜索,其注释如下:

/*
 * This is the one of the only two functions that should be called from outside.
 * It takes a RegexTree and computes the set of chars that can start it.
 */
匹配算法包含一段代码,如果输入字符串短于计算的前缀,该代码将立即返回不匹配结果

请注意,当然,它也在寻找锚并对其进行优化


我没有在代码中找到最小长度优化,但我承认我没有仔细阅读(总有一天会这样做)。但是我知道其他的正则表达式实现可以进行这种优化(我想到的是PCRE)。无论如何,.NET实现有它自己的优化方式,你应该依靠它。

你有什么问题
(?i)[A-Z]{3}
匹配3个拉丁字母序列,
(?i)[A-Z]+(?=123)
执行相同的操作,但仅在后面没有
123
的序列
123
不是长度限制。@Stribizev我试图通过阻止引擎检查字符串来提高性能,我们知道这些字符串永远不会匹配,因为它们不够长。如果这是可能的话,我会说对于如此短的字符串,性能差异其实并不重要。尤其是使用编译的正则表达式。您也可以只进行一次匹配,然后查看哪一组匹配。@Joey对于具有更长更复杂模式的更长字符串如何?@erotavlas:对于那些复杂模式,很难确定最短有效输入是什么。