Regex 负前瞻错误正则表达式

Regex 负前瞻错误正则表达式,regex,Regex,我有一个正则表达式: ^\/admin\/(?!(e06772ed-7575-4cd4-8cc6-e99bb49498c5)).*$ 我的输入字符串: /admin/e06772ed-7575-4cd4-8cc6-e99bb49498c5 据我所知,负前瞻应检查组(e06772ed-7575-4cd4-8cc6-e99bb49498c5)是否匹配,或者我是否不正确 既然输入字符串有一个组匹配,为什么负前瞻不起作用?我的意思是我希望我的正则表达式e06772ed-7575-4cd4-8cc6-

我有一个正则表达式:

^\/admin\/(?!(e06772ed-7575-4cd4-8cc6-e99bb49498c5)).*$
我的输入字符串:

/admin/e06772ed-7575-4cd4-8cc6-e99bb49498c5
据我所知,负前瞻应检查组
(e06772ed-7575-4cd4-8cc6-e99bb49498c5)
是否匹配,或者我是否不正确

既然输入字符串有一个组匹配,为什么负前瞻不起作用?我的意思是我希望我的正则表达式
e06772ed-7575-4cd4-8cc6-E99BB498C5
匹配输入字符串
e06772ed-7575-4cd4-8cc6-E99BB498C5

删除负前瞻性可以使这个正则表达式正常工作


这个问题的要点是:环视匹配一个位置,而不是字符串

(?!e06772ed-7575-4cd4-8cc6-e99bb49498c5)
将匹配任何位置,即,后跟
e06772ed-7575-4cd4-8cc6-E99BB498C5

也就是说:

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

/admin/abc
甚至:

/admin/e99bb49498c5
但不是:

/admin/e06772ed-7575-4cd4-8cc6-e99bb49498c5/daffdakjf;adjk;af
这正是为什么每当您删除
?,就会出现匹配的原因。字符串与完全匹配


接下来,您可能会丢失lookahead中的括号,它们在这里没有通常的分组功能。

您似乎需要
(?!*e06772ed-7575-4cd4-8cc6-e99bb49498c5$)
不完全一样,您的正则表达式将匹配任何用户,我的正则表达式必须匹配admin和UID相同的情况,删除lookahead会得到这个结果。但我不知道为什么(因为它应该与前瞻性配合使用)。这还不清楚:你是否需要匹配
/admin/e06772ed-7575-4cd4-8cc6-e99bb498c5
?消极的前瞻性断言,在你的情况下,
e06772ed-7575-4cd4-8cc6-e99bb498c5
,某种模式不能从当前位置匹配。由于这个断言失败,整个匹配被丢弃。你是否需要一个积极的展望呢?@Wiktor Stribiżew什么不清楚?假设它是另一个用户,
user1/e06772ed-7575-4cd4-8cc6-e99bb498c5
您的正则表达式将匹配它和
admin/e06772ed-7575-4cd4-8cc6-e99bb498c5
。这是不正确的。接下来,你可能会丢失前瞻中的括号,它们在这里没有通常的分组功能。这不一定是真的,它们仍然捕获并在其他场景中(考虑到所选的正则表达式引擎支持这一点)用于反向引用和条件。在正向查找中,您仍然可以在结果匹配和替换操作中访问捕获的值。@SebastianProske必须具体。例如,在PCRE中,您可以在分组仍然相关的位置创建一个类似于
(?!(a)\1)
的前瞻。您还可以创建一个积极的前瞻,如
(?=(a))
,并在匹配和替换中引用该组。圆括号仍然构成前瞻场景中捕获的组。是。这就是你的消极展望。这不是我们在这里讨论的问题。你写道,它们没有通常的分组功能。但事实仍然如此,他们仍然组成小组。是的,您可以删除它们,并且不会损害这个特定的模式,但是您不能这样概括它。