在这个例子中:
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
我的错误在哪里?
答案 0 :(得分:2)
在正则表达式引擎与\s*
的最后一个空格匹配后,前瞻测试失败(因为存在(db)
)。
那么之后会发生什么?
正则表达式引擎回溯(它试图找到另一种方法来使模式成功)。它返回最后一个空格,现在新位置不是(db)
,而是空格(并且前瞻成功)。
防止此行为的方法是使用占有量词来强制正则表达式引擎不回溯:所以\s*+
您可以使用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
否则,由于前瞻性空间,前瞻通过。