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

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

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

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

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


当前回答

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

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

其他回答

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

.+?(abc)

例如,在这行中:

I have this very nice senabctence

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

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

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

我相信你需要子表达式。子表达式可以使用普通()括号。

本部分来自grep手册:

反向引用和子表达式后引用\n(其中n是一个数字)与子字符串匹配之前由正则表达式。

做类似于^[^(abc)]的事情应该会奏效。

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

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

如果您希望捕获“abc”以下的所有内容:

/^(.*?)abc/

说明:

()捕获括号内的表达式,以便使用$1、$2等进行访问。

^匹配行首

.*匹配任何内容?非贪婪(匹配所需的最小字符数)-[1]

[1] 需要这样做的原因是,否则,在以下字符串中:

whatever whatever something abc something abc

默认情况下,正则表达式是贪婪的,这意味着它将尽可能匹配。因此/^.*abc/将匹配“whateverwhatever某物abc某物”。添加非贪婪量词?使正则表达式只匹配“无论什么”。

正如Jared Ng和@Issun所指出的,解决这种正则表达式的关键是“匹配某个单词或子字符串之前的所有内容”或“匹配某一单词或子串之后的所有内容。”。在这里阅读更多关于他们的信息。

在您的特定情况下,可以通过积极的展望来解决:.+?(?=abc)

一幅画胜过千言万语。请参见屏幕截图中的详细说明。