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

其他回答

在Python中:

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

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

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

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

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

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

你需要看看断言,比如.+?(?=abc)。

请参阅:零长度断言的前瞻性和滞后性

请注意[abc]与abc不同。在括号内,它不是一个字符串-每个字符只是一种可能性。在括号外,它成为字符串。

试试看:

.+?efg

查询:

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

输出:

hijklmn

解决方案

/[\s\s]*?(?=abc)/

这将匹配

直到(但不包括)精确的序列“abc”

正如OP所问的,即使源字符串包含换行符,即使序列以abc开头。但是,如果源字符串可能包含换行符,请确保包含多行标志m。

它的工作原理

\s表示任何空白字符(例如空格、制表符、换行符)

\S表示任何非空白字符;即与%s相反

一起[\s\s]表示任何字符。这几乎与相同。除此之外。与换行符不匹配。

*表示前面的标记出现了0+次。在源字符串以abc开头的情况下,我使用了this而不是+。

(?=)被称为正向前瞻。它需要与括号中的字符串匹配,但恰好在它之前停止,因此(?=abc)表示“直到但不包括abc,但abc必须存在于源字符串中”。

? 介于[\s\s]*和(?=abc)之间表示懒惰(又称非贪婪)。即在第一abc处停止。如果abc出现不止一次,那么如果没有这一点,它将捕获直到abc最后出现的每个字符。