我在尝试一些我觉得对我来说应该相当明显的事情,但事实并非如此。我试图匹配一个不包含特定字符序列的字符串。我尝试使用[^ab], [^(ab)]等来匹配不包含'a'或'b'的字符串,或只包含'a'或'b'或'ba',但不匹配'ab'。我给出的例子不能匹配ab,这是真的,但它们也不能单独匹配a,我需要它们。有什么简单的方法吗?
当前回答
只需在字符串中搜索“ab”,然后对结果求反:
!/ab/.test("bamboo"); // true
!/ab/.test("baobab"); // false
它看起来更简单,也应该更快。
其他回答
正则表达式[^ab]将匹配例如'ab ab ab',但不匹配'ab',因为它将匹配字符串'a '或'b '。
你有什么语言/场景?你能从原始集合中减去结果,然后匹配ab吗?
如果您正在使用GNU grep,并且正在解析输入,则使用'-v'标志来反转结果,返回所有不匹配的结果。其他正则表达式工具也有“返回不匹配”功能。
如果我理解正确的话,你想要所有的东西,除了那些包含'ab'的项目。
最简单的方法是将否定完全从正则表达式中移除:
if (!userName.matches("^([Ss]ys)?admin$")) { ... }
在这种情况下,我可能只是简单地避免正则表达式,并使用如下内容:
if (StringToTest.IndexOf("ab") < 0)
//do stuff
这可能也会快得多(上面对regex方法的快速测试表明,这种方法所花费的时间约为regex方法的25%)。一般来说,如果我知道我正在寻找的确切字符串,我发现正则表达式是多余的。因为你知道你不想要“ab”,所以测试字符串是否包含那个字符串很简单,不需要使用regex。
使用[^ab]这样的字符类将匹配不在字符集内的单个字符。(^是否定的部分)。
要匹配不包含多字符序列ab的字符串,你需要使用负前向:
^(?:(?!ab).)+$
上面的表达式在regex注释模式下解析为:
(?x) # enable regex comment mode
^ # match start of line/string
(?: # begin non-capturing group
(?! # begin negative lookahead
ab # literal text sequence ab
) # end negative lookahead
. # any single character
) # end non-capturing group
+ # repeat previous match one or more times
$ # match end of line/string
使用消极前视:
^(?!.*ab).*$
更新:在下面的评论中,我说过这种方法比彼得的回答中给出的要慢。从那以后,我进行了一些测试,发现它确实快了一些。然而,与其他技术相比,更喜欢这种技术的原因不是速度,而是简单。
另一种技术,在这里称为缓和贪婪标记,适用于更复杂的问题,比如匹配分隔符由多个字符组成的带分隔符的文本(如HTML,如Luke在下面评论的那样)。对于问题中描述的问题,它是多余的。
对于任何感兴趣的人,我用Lorem Ipsum的大量文本进行了测试,计算了不包含“quo”一词的行数。这些是我使用的正则表达式:
(?m)^(?!.*\bquo\b).+$
(?m)^(?:(?!\bquo\b).)+$
无论我是在整个文本中搜索匹配,还是将其分解成行并单独匹配它们,锚定的前向始终优于浮动的前向。
推荐文章
- 使用String.split()和多个分隔符
- 从数字中移除无关紧要的尾随零?
- 最终的邮政编码和邮政正则表达式是什么?
- 删除多个空白空间
- 正则表达式不是运算符
- 如何通过正则表达式过滤熊猫行
- 我如何在JavaScript中使用unicode感知的正则表达式?
- RE错误:在Mac OS X上的非法字节序列
- Regex验证日期格式dd/mm/YYYY, dd-mm-YYYY, dd.mm。YYYY, dd mmm, dd-mmm-YYYY, dd/mmm/YYYY, dd.mmm.YYYY与闰年支持
- jQuery验证:如何为正则表达式验证添加规则?
- 正则表达式在Javascript中获得括号之间的字符串
- 如何检查有效的电子邮件地址?
- Regex邮件验证
- 如何在bash脚本中使用正则表达式否定测试?
- 如何提取位于圆括号(圆括号)之间的文本?