采用以下正则表达式:/^[^abc]/。这将匹配字符串开头的任何单个字符,a、b或c除外。

如果在其后面添加*–/^[^abc]*/–正则表达式将继续向结果中添加每个后续字符,直到它满足a、b或c。

例如,对于源字符串“qwerty qwerty whatever abc hello”,表达式将匹配到“qwerty-qwerty wh”。

但如果我希望匹配的字符串是“qwerty qwerty whatever”呢?

换句话说,我如何将所有内容都匹配到(但不包括)精确的序列“abc”?


当前回答

我想将sidyll的答案扩展到正则表达式的不区分大小写版本。

如果你想匹配abc/abc/abc。。。不区分大小写(我需要这样做),使用以下正则表达式。

.+?(?=(?i)abc)

说明:

(?i) - This will make the following abc match case insensitively.

正则表达式的另一种解释与sidyll指出的相同。

其他回答

您没有指定使用的是哪种类型的正则表达式,但这将在任何一个最受欢迎的可以被认为是“完整”的工作。

/.+?(?=abc)/

它的工作原理

.+?部分是.+的非贪婪版本(一个或多个任何事情)。当我们使用.+,发动机基本上会匹配一切。然后,如果正则表达式中有其他内容,它将按步骤返回试图匹配以下部分。这是贪婪的行为,意味着尽可能满足。

使用.+?时?,而不是一次匹配,然后返回其他条件(如果有),引擎将通过以下方式匹配下一个字符步骤,直到匹配正则表达式的后续部分(如果有,则再次)。这是不贪婪的,意味着尽可能少地匹配满足

/.+X/  ~ "abcXabcXabcX"        /.+/  ~ "abcXabcXabcX"
          ^^^^^^^^^^^^                  ^^^^^^^^^^^^

/.+?X/ ~ "abcXabcXabcX"        /.+?/ ~ "abcXabcXabcX"
          ^^^^                          ^

接下来我们有(?={contents}),一个零宽度断言,环顾四周。此分组结构与其内容,但不算作匹配字符(零宽度)。它仅在是否匹配时返回(断言)。

因此,换句话说,正则表达式/.+?(?=abc)/表示:

尽可能少地匹配任何字符,直到找到“abc”,不计算“abc”。

对于Java中的正则表达式,我也相信在大多数正则表达式引擎中,如果您想包括最后一部分,这将起作用:

.+?(abc)

例如,在这行中:

I have this very nice senabctence

选择“abc”之前的所有字符,并包括abc。

使用正则表达式,结果将是:我有一个非常好的senabc

测试一下:https://regex101.com/r/mX51ru/1

在Python中:

.+?(?=abc)适用于单线情况。

[^]+?(?=abc)不起作用,因为python无法将[^]识别为有效的正则表达式。要使多行匹配工作,需要使用re.DOTALL选项,例如:

re.findall('.+?(?=abc)', data, re.DOTALL)

$标记字符串的结尾,因此类似这样的操作应该有效:[[^abc]*]$,其中您要查找的任何内容都不以abc的任何迭代结尾,但它必须位于结尾

此外,如果您使用的是带有正则表达式的脚本语言(如PHP或JavaScript),它们有一个搜索函数,当它第一次遇到模式时停止(您可以指定从左开始或从右开始,或者使用PHP,您可以执行内爆以镜像字符串)。

匹配从开始到“在ABC之前”或“行结束”(如果没有ABC)

(1) 如果字符串在任何地方都不包含ABC,则匹配整个字符串

(2) 与空字符串不匹配

(不检查带换行符的字符串)

^.+?(?=ABC|$)