我在尝试一些我觉得对我来说应该相当明显的事情,但事实并非如此。我试图匹配一个不包含特定字符序列的字符串。我尝试使用[^ab], [^(ab)]等来匹配不包含'a'或'b'的字符串,或只包含'a'或'b'或'ba',但不匹配'ab'。我给出的例子不能匹配ab,这是真的,但它们也不能单独匹配a,我需要它们。有什么简单的方法吗?
当前回答
是的,这叫做负前瞻。它是这样的(?!正则表达式。所以abc(?!def)会匹配abc后面不跟def,所以它会匹配abce abc abck等等。
同样,也有积极的前瞻- (?=正则表达式。所以abc(?=def)将匹配abc后面跟着def。
也有消极的和积极的向后看- (?<!这里的正则表达式)和(?<=regex here)分别
需要注意的一点是,负前向为零宽度。也就是说,它没有占用任何空间。
所以看起来a(?=b)c会匹配abc,但事实并非如此。它会匹配'a',然后正前向匹配'b'但它不会向前移动到字符串中。然后它会尝试匹配'c'和'b',这是行不通的。类似地^a(?=b)b$将匹配'ab'而不是'abb',因为查找的宽度为零(在大多数regex实现中)。
更多信息请访问本页
其他回答
使用你所描述的正则表达式是最简单的方法(据我所知)。如果你想要一个范围,你可以使用[^a-f]。
Abc (?!def)将匹配没有跟随的Abc by def,所以它匹配abce abc, abck,等等,如果我不想要def xyz也不会是abc(?!(def)(xyz)) ???
我也有同样的问题,并找到了解决方案:
abc(?:(?!def))(?:(?!xyz))
这些不可计数的组由“AND”组合在一起,所以这应该是可行的。希望能有所帮助。
使用消极前视:
^(?!.*ab).*$
更新:在下面的评论中,我说过这种方法比彼得的回答中给出的要慢。从那以后,我进行了一些测试,发现它确实快了一些。然而,与其他技术相比,更喜欢这种技术的原因不是速度,而是简单。
另一种技术,在这里称为缓和贪婪标记,适用于更复杂的问题,比如匹配分隔符由多个字符组成的带分隔符的文本(如HTML,如Luke在下面评论的那样)。对于问题中描述的问题,它是多余的。
对于任何感兴趣的人,我用Lorem Ipsum的大量文本进行了测试,计算了不包含“quo”一词的行数。这些是我使用的正则表达式:
(?m)^(?!.*\bquo\b).+$
(?m)^(?:(?!\bquo\b).)+$
无论我是在整个文本中搜索匹配,还是将其分解成行并单独匹配它们,锚定的前向始终优于浮动的前向。
是的,这叫做负前瞻。它是这样的(?!正则表达式。所以abc(?!def)会匹配abc后面不跟def,所以它会匹配abce abc abck等等。
同样,也有积极的前瞻- (?=正则表达式。所以abc(?=def)将匹配abc后面跟着def。
也有消极的和积极的向后看- (?<!这里的正则表达式)和(?<=regex here)分别
需要注意的一点是,负前向为零宽度。也就是说,它没有占用任何空间。
所以看起来a(?=b)c会匹配abc,但事实并非如此。它会匹配'a',然后正前向匹配'b'但它不会向前移动到字符串中。然后它会尝试匹配'c'和'b',这是行不通的。类似地^a(?=b)b$将匹配'ab'而不是'abb',因为查找的宽度为零(在大多数regex实现中)。
更多信息请访问本页
只需在字符串中搜索“ab”,然后对结果求反:
!/ab/.test("bamboo"); // true
!/ab/.test("baobab"); // false
它看起来更简单,也应该更快。
推荐文章
- 如何从JavaScript中使用正则表达式的字符串中剥离所有标点符号?
- 正则表达式中的单词边界是什么?
- 如何将一个标题转换为jQuery的URL段塞?
- Javascript和regex:分割字符串并保留分隔符
- (grep)正则表达式匹配非ascii字符?
- 如何在保持原始字符串的同时对字符串执行Perl替换?
- 创建正则表达式匹配数组
- *的区别是什么?和。*正则表达式?
- 如何将“camelCase”转换为“Camel Case”?
- 在Java中使用正则表达式提取值
- Java中的正则表达式命名组
- 使用正则表达式搜索和替换Visual Studio代码
- 使用split("|")按管道符号拆分Java字符串
- 替换字符串中第一次出现的模式
- “\d”在正则表达式中是数字吗?