采用以下正则表达式:/^[^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指出的相同。

其他回答

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

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

("(.*?)")/g

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

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

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

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

试试看:

.+?efg

查询:

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

输出:

hijklmn

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

.+?(abc)

例如,在这行中:

I have this very nice senabctence

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

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

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

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

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

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

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

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

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

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