我想知道是否:
/.*(Set-Cookie: (.*))?;.*(<\?xml.*)/
是一个指数正则表达式。
由于
答案 0 :(得分:4)
这实际上取决于正则表达式引擎,但在大多数引擎中,当没有匹配时,该模式可能是高度的多项式(可能是立方或更高)。
您可以使用例如RegexBuddy看看匹配需要多少步骤,更重要的是,不匹配某些输入。您可以使用它来衡量回溯过程在某些引擎中的复杂程度。
目前尚不清楚你想要做什么,但是这种模式对Set-Cookie
子模式允许是可选的并没有太大作用(例如,即使它存在,该组也可能与该字符串不匹配,因为它是可选的开始)。
如果您正在尝试解析XML,请拜托请不要使用正则表达式。大多数现代语言中都有许多XML解析器,它们不仅适用于工作,而且与正则表达式一样,它们也是正确的,更令人愉快。
要指出为什么这种模式不起作用(无论是快还是慢都无关紧要),请考虑以下输入:
Set-Cookie: NOMNOMNOM;<?xml
使用模式/.*(Set-Cookie: (.*))?;.*(<\?xml.*)/
,整个字符串匹配,但第1组不会捕获Set-Cookie: NOMNOMNOM
,第2组不会捕获NOMNOMNOM
(as seen on rubular.com )。那是因为领先的.*
吞噬了cookie,而且由于cookie子模式是可选的,所以无论如何它仍然是匹配。
我们可以尝试通过将.*
不情愿的.*?
作为Set-Cookie
来“修复”此问题。现在,第1组可以匹配";<?xml"
,这可能是一直以来的意图(as seen on rubular.com)。
但是,这几乎不是一种改进。你真的不想走这个方向。正则表达式仍然存在许多问题,如果不是几乎不可能的话,让它正常工作将非常困难。
应该注意的是,给定的模式与;
(as seen on rubular.com)匹配。也就是说,只要字符串中的任何位置都有<?xml
,然后是{{1}},模式就会匹配。目前尚不清楚这种模式是否确实有用。