我在尝试一些我觉得对我来说应该相当明显的事情,但事实并非如此。我试图匹配一个不包含特定字符序列的字符串。我尝试使用[^ab], [^(ab)]等来匹配不包含'a'或'b'的字符串,或只包含'a'或'b'或'ba',但不匹配'ab'。我给出的例子不能匹配ab,这是真的,但它们也不能单独匹配a,我需要它们。有什么简单的方法吗?


当前回答

正则表达式[^ab]将匹配例如'ab ab ab',但不匹配'ab',因为它将匹配字符串'a '或'b '。

你有什么语言/场景?你能从原始集合中减去结果,然后匹配ab吗?

如果您正在使用GNU grep,并且正在解析输入,则使用'-v'标志来反转结果,返回所有不匹配的结果。其他正则表达式工具也有“返回不匹配”功能。

如果我理解正确的话,你想要所有的东西,除了那些包含'ab'的项目。

其他回答

最简单的方法是将否定完全从正则表达式中移除:

if (!userName.matches("^([Ss]ys)?admin$")) { ... }

正则表达式[^ab]将匹配例如'ab ab ab',但不匹配'ab',因为它将匹配字符串'a '或'b '。

你有什么语言/场景?你能从原始集合中减去结果,然后匹配ab吗?

如果您正在使用GNU grep,并且正在解析输入,则使用'-v'标志来反转结果,返回所有不匹配的结果。其他正则表达式工具也有“返回不匹配”功能。

如果我理解正确的话,你想要所有的东西,除了那些包含'ab'的项目。

使用[^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”,然后对结果求反:

!/ab/.test("bamboo"); // true
!/ab/.test("baobab"); // false

它看起来更简单,也应该更快。

Abc (?!def)将匹配没有跟随的Abc by def,所以它匹配abce abc, abck,等等,如果我不想要def xyz也不会是abc(?!(def)(xyz)) ???

我也有同样的问题,并找到了解决方案:

abc(?:(?!def))(?:(?!xyz))

这些不可计数的组由“AND”组合在一起,所以这应该是可行的。希望能有所帮助。