使用双重否定匹配的正则表达式

3
给定一系列字符串:
- error.user - success - success.user - success.admin
我想编写一个正则表达式,它将匹配任何不以error开头且没有.user在其中的内容。 因此,对于这个列表,successsuccess.admin会被匹配。
我现在的做法是:/^((?!error)\w*)((?!\.*user)\w*)/ 第一部分:((?!error)\w*)工作得很好,将匹配范围缩小到以success开头的字符串。 但是第二部分:((?!\.*user)\w*)却没有起到任何作用。 我认为第一部分匹配了太多的内容。
我正在使用PHP / PCRE进行操作。 下面是我的regex101.com链接:https://regex101.com/r/l2sZru/1
1个回答

2
您需要这样修复您的负正则表达式:
^(?!error|.*\.user)[\w.]+$

正则表达式演示

这里的(?!error|.*\.user)表示如果输入以error开头或者在输入中找到了.user,就会失败。

你的正则表达式中的(?!\.*user)表示当输入以0个或多个点(.)开头,后面跟着user时,断言失败。


1
非常感谢!我会在7分钟内接受您的答案。 - Quasipickle
1
^(?!error|.*\.user)[\w.]+$更短。 - Wiktor Stribiżew

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