正则表达式是否足够聪明,可以采用最短路径(如果可用)来查找匹配项



我正在使用一些"字符计算"来帮助正则表达式找到解析算法匹配的最短路径,但我想知道 C# 正则表达式引擎是否已经这样做了,我只是添加了不必要的代码。

目前,我首先找到等号=的下一个匹配项,然后运行带有偏移量的正则表达式以捕获键的名称。

([0-9A-Za-z]+s*)=这样的正则表达式会尝试首先找到等号吗? 还是会逐字运行该表达式并首先找到 0-9A-Za-z 字符,然后检查空格然后检查等号?

regexstorm.net 的

试验表明,正则表达式将首先查找该组。空白搜索等号成本较低,插入较长的示例文本,不能在 so 中使用 url 缩短器。

也许你可以使用积极的回溯,如果它符合你的要求。 (?<=[0-9A-Za-z]+s*)=似乎更快,就像先搜索等号一样。

大多数正则表达式引擎都很贪婪,并试图尽可能多地匹配。例如,如果您的输入是"堆栈溢出上的hello world",那么[a-z]+s将匹配到"溢出"的开头,即"堆栈上的hello world "。

贪婪的反面是懒惰。如果你使用输入"你好世界在堆栈溢出"作为输入和[a-z]+?s,它将只匹配"hello"。

也就是说,正则表达式总是从左到右开始,直到它必须回溯。也就是说,在您的示例中,它将首先查找字母或数字,然后继续查找第一个字母或数字之后的字母和数字,然后查找一些空格,最后查找等号。

最新更新