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

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

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

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

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


当前回答

这将对正则表达式有意义。

确切的单词可以从以下regex命令中获得:

("(.*?)")/g

在这里,我们可以得到属于双引号内的全局准确单词。

例如,如果我们的搜索文本是

这是“双引号”单词的示例

然后我们会从那句话中得到“双引号”。

其他回答

试试看:

.+?efg

查询:

select REGEXP_REPLACE ('abcdefghijklmn','.+?efg', '') FROM dual;

输出:

hijklmn

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

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

(2) 与空字符串不匹配

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

^.+?(?=ABC|$)

您的问题没有指定后续的字符序列是否是可选的,但所有其他答案都假定序列总是给定的。所以这里有一个,如果序列是可选的。

例如,如果将代码匹配到像foo#这样的行注释。。。或foo//。。。,行注释本身可能是可选的,但可能仍然希望与前面的代码匹配。

在这种情况下,我会使用^(?:(?!abc)。)*(或行注释:^(?:(?!#)。)*或^(?:(?!\/\/).)*)。

说明:^标记行的开头。(?:)是一个非捕获组,因为常规组将额外捕获组中最后一个匹配的字母,这是我们不需要的。在组内,我们使用负前瞻(?!)和。,所以除了特定的序列之外,所有的东西都是匹配的。使用*重复0到无限次。如果只想匹配非空字符串,请改用+。

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

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

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

说明:

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

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

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

/^(.*?)abc/

说明:

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

^匹配行首

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

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

whatever whatever something abc something abc

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