使用正则表达式负向先行断言排除精确字符串

3

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

目前我所拥有的是:

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

这个正则表达式可以正确拒绝abc/pqr/xyz,但也会拒绝我想要匹配的abc/pqrst/xyz
我希望只有当pqr是一个完整的单词时才排除它,而不是当它是较长单词(如pqrst)的子字符串时排除它。

1
一个完整的单词 pqr?在它周围加上 \babc\/(?!.*\bpqr\b).*\/xyz。请参阅 https://regex101.com/r/HjJBBH/1 - Wiktor Stribiżew
谢谢Wiktor。现在它可以工作了 :) - Kunal_89
可能是Regex-如何排除单个单词?的重复问题。 - revo
在你自己的答案下面,还有其他评论。 - revo
2个回答

1
你可以在预查中使用单词边界pqr
 abc\/(?!.*\bpqr\b).*\/xyz
           ^^   ^^

请查看正则表达式演示。如果您不使用单词边界,任何pqr都会导致正则表达式失败,当您添加单词边界时,只有那些包含完整单词pqr的匹配项将失败。

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

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

请查看另一个演示。这里,(?!(?:.*\/)?pqr\/)将匹配在abc/或在abc后面,跟随0个或多个任意字符直到最后一个/,并且只有当跟随另一个/时才匹配。在所有其他上下文中,您都会有一个匹配。

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

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


你经常将问题标记为重复。为什么你会回答这个已经被问了数十亿次的问题呢? - revo
因为单词边界并不是唯一的解决方案。问题实际上并不是关于单词边界的。在指责之前请仔细阅读。此外,在这里要说的远不止“使用\b”。 - Wiktor Stribiżew
鉴于正则表达式使用 .* 而不是 \w*,那么一个有效值以 pqr 开头,后面跟着 \W 中的某些字符的可能性不大吗? - Rawling
@Rawling:这就是为什么我建议另一种方法。它还可以进一步改进- abc\/(?!(?:.*\/)?pqr(?:\/|$)).*\/xyz(允许在字符串末尾匹配 pqr)。 - Wiktor Stribiżew
1
这里的评论是关于答案讨论的,而不是关于问题关闭等的讨论...如果你真的想讨论,请到[元]。 - Jon Clements

0
一个简单的检查只需要看一下此时此刻你是否有pqr/
abc\/(?!.*pqr\/).*\/xyz

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接