如何让正则表达式不接受某些值?

4 投票
2 回答
1107 浏览
提问于 2025-04-17 15:16

我想让我的正则表达式匹配一些值,但不接受其他值。基础的正则表达式是 ^/.+/.+$

我希望最后一个 / 后面不接受问号,并且第一个 / 前面不接受 peopledungen

MATCH: /a/b/c/d
MATCH: /a/b
NO MATCH: /people/b/c/d
MATCH: /peoples/b/c/d
NO MATCH: /a/b/c?x=y

我知道可以用 [^ABCD] 来表示不匹配某些字符,但这对整个字符串不管用。

谁能帮帮我?

2 个回答

1

你可以使用

^/(?!(people|dungen)/).+/[^?]+$
4

在最后一个 / 后面拒绝问号很简单 - 用一个字符类 [^?] 来代替 .

^/.+/[^?]+$

如果你想在两个 / 之间拒绝 peopledungen,可以使用负向前瞻。因为你想拒绝 /people/ 但接受 /peoples/,所以这个前瞻会一直检查到字符串的末尾。

^/(?!(?:people|dungen)/.+$).+/.+$

所以把这两者结合起来:

^/(?!(?:people|dungen)/[^?]+$).+/[^?]+$

让我们来测试一下。

>>> import re
>>> r = re.compile(r'^/(?!(?:people|dungen)/[^?]+$).+/[^?]+$')
>>> for s in ['/a/b/c/d', '/a/b', '/people/b/c/d', '/peoples/b/c/d', '/a/b/c?x=y']:
...     print not not r.search(s)
...
True
True
False
True
False

撰写回答