2017-10-13 36 views
0

我有一个正则表达式:负向前查找故障正则表达式

^\/admin\/(?!(e06772ed-7575-4cd4-8cc6-e99bb49498c5)).*$ 

我的输入字符串:

/admin/e06772ed-7575-4cd4-8cc6-e99bb49498c5 

据我所知,负前瞻应检查组(e06772ed-7575-4cd4-8cc6-e99bb49498c5)有一个比赛,还是我不正确的?

由于输入字符串具有组匹配,为什么负向预测不起作用?我的意思是,我希望我的正则表达式为e06772ed-7575-4cd4-8cc6-e99bb49498c5以匹配输入字符串e06772ed-7575-4cd4-8cc6-e99bb49498c5

消除负向预测使这个正则表达式正确工作。

Tested with regex101.com

+0

您似乎需要'(?!。* e06772ed-7575-4cd4-8cc6-e99bb49498c5 $)' –

+0

不是,您的正则表达式可以匹配任何用户,我的正则表达式在管理员和UID相同时必须匹配,前瞻给出了这个结果。但我无法弄清楚为什么(因为它应该与前瞻一起工作)。 – CrazySabbath

+0

这并不清楚:你需要匹配'/ admin/e06772ed-7575-4cd4-8cc6-e99bb49498c5'吗? –

回答

1

这一问题的takeway消息为:一个环视一个位置,而不是一个字符串匹配。

(?!e06772ed-7575-4cd4-8cc6-e99bb49498c5) 

将匹配的任何位置,也就是不随后e06772ed-7575-4cd4-8cc6-e99bb49498c5

这意味着,认为:

^\/admin\/(?!(e06772ed-7575-4cd4-8cc6-e99bb49498c5)).*$ 

将匹配:

/admin/abc 

,甚至:

/admin/e99bb49498c5 

但不是:

/admin/e06772ed-7575-4cd4-8cc6-e99bb49498c5/daffdakjf;adjk;af 

这正是解释为什么只要你摆脱?!即可进行比赛。该字符串与完全匹配

接下来,你可以在你的lookahead中丢失圆括号,他们在这里没有他们通常的分组功能。

+0

一个很好的解释。接受答案。 – CrazySabbath

+0

_接下来,你可以在你的lookahead中丢掉括号,他们在这里没有他们通常的分组功能。这不一定是真的,他们仍然捕获并在其他情况下(因为选择的正则表达式引擎支持这个)反向引用和条件。在积极的预测中,您仍然可以访问匹配结果和替换操作中的捕获值。 –

+0

@SebastianProske具体。 –