使用正则表达式否定前瞻排除确切的字符串

Exclude exact string using regex negative lookahead

我想使用正则表达式从字符串中排除 pqr

我目前拥有的是

abc\/(?!.*pqr).*\/xyz

这正确地拒绝了 abc/pqr/xyz,但它也拒绝了我希望它匹配的 abc/pqrst/xyz

我希望 pqr 仅在它是一个完整的单词时被排除,而不是在它是较长单词的子字符串时被排除,例如 pqrst.

您可以将 word boundaries 与前瞻中的 pqr 一起使用:

 abc\/(?!.*\bpqr\b).*\/xyz
           ^^   ^^

regex demo。如果您不使用单词边界,任何 pqr 都会导致正则表达式失败,而当您添加单词边界时,只有那些 pqr 作为一个完整单词出现的匹配才会失败。

另一种方法是在特定上下文中匹配 pqr

 abc\/(?!(?:.*\/)?pqr\/).*\/xyz

参见 another demo。此处,(?!(?:.*\/)?pqr\/) 将匹配 abc/ 之后或 abc 后跟 0+ 个字符,直到最后一个 / 并且仅当后跟另一个 / 时。在所有其他情况下,您将有一个匹配项。

注意:应该对 xyz 应用相同的方法(您可以在其后添加 \b 以匹配整个单词 xyz.

注意 2:要要求 pqr 出现在 xyz 之前,请使用 abc\/(?!(?:(?!\/xyz).)*\bpqr\b).*\/xyz.

一个简单的检查就是看看你当时没有 pqr/:

abc\/(?!.*pqr\/).*\/xyz

另请注意 (?!.* 中的 .* 会阻止您接受 abc/defpqr/xyz;你确定那是你想要的吗?