Lookahead没有在“没有跟着”正则表达式中工作

时间:2015-06-18 13:52:58

标签: regex

在这个例子中:

public class SessionAppendingRouteHandler : IRouteHandler
{
   public IHttpHandler GetHandler(RequestContext context)
   {
       SessionAppendingHttpHandler handler = new SessionAppendingHttpHandler();
       handler.RequestContext = context;
       return handler;
   }
}




public class SessionAppendingHttpHandler : MvcHandler
{
    public override ProcessRequest(RequestContext context)
    {
          //append your sid here
    }
}


// and in the route setup

RouteTable.Routes.Add( new Route
{
   Url = "/[controller].mvc/[action]/",
   Defaults = new { action = "index" },
   RouteHandler = typeof(SessionAppendingRouteHandler)
});

我应该只匹配包含jump (foo) (db); jump (foo); call(bar)(db); 但未跟jump|call|rts|rti的第二行。

(db)

https://regex101.com/r/fS2gA0/1

我的错误在哪里?

4 个答案:

答案 0 :(得分:2)

在正则表达式引擎与\s*的最后一个空格匹配后,前瞻测试失败(因为存在(db))。

那么之后会发生什么? 正则表达式引擎回溯(它试图找到另一种方法来使模式成功)。它返回最后一个空格,现在新位置不是(db),而是空格(并且前瞻成功)。

防止此行为的方法是使用占有量词来强制正则表达式引擎不回溯:所以\s*+

demo

您可以使用regex101调试器清楚地看到行为。

答案 1 :(得分:1)

您的在线正则表达式测试程序显示它与jump (foo)匹配,而不是jump (foo) jump (foo)后面没有(db)。接下来是 (db),但你的正则表达式没有问题。是的,您的正则表达式中有\s*,但仍允许匹配不包含空格。

要解决此问题,您可以将\s*移动(或复制)到您的否定前瞻中。

答案 2 :(得分:1)

最后添加分号,这是一个完成工作的perl脚本:

my $re = qr~
(?:jump|call|rts|rti)\s*
\(\w+\)\s*
(?!\(db\)) # Not followed with (db)
;  # <-- here
~xi;

while(<DATA>) {
    chomp;
    say /$re/ ? "OK: $_" : "KO: $_";
}

__DATA__
jump (foo) (db);
jump (foo);
call(bar)(db);

<强>输出:

KO: jump (foo) (db);
OK: jump (foo);
KO: call(bar)(db);

答案 3 :(得分:0)

\(\w+\)\s*

可以更改为:

\(\w+\)\s

否则,由于前瞻性空间,前瞻通过。