如何在正则expression式中匹配“直到这个字符序列的任何东西”?

采取这个正则expression式: /^[^abc]/ 。 这将匹配string开头的任何单个字符,除了a,b或c。

如果在它后面添加* ,则正则expression式将继续将每个后续字符添加到结果中,直到遇到ab c

例如,对于源string"qwerty qwerty whatever abc hello" ,expression式将匹配到"qwerty qwerty wh"

但是如果我想要匹配的string是"qwerty qwerty whatever "

…换句话说,我怎样才能匹配(但不包括) 确切的序列 "abc"

你没有指定正在使用哪种正则expression式,但是这可以在任何可以被认为是“完整”的最stream行的正则expression式中使用。

 /.+?(?=abc)/ 

怎么运行的

.+? 部分是.+ (一个或多个任何东西)的非贪婪版本。 当我们使用.+ ,引擎基本上会匹配所有的东西。 然后,如果在正则expression式中还有其他东西,它将会逐步返回,尝试匹配下面的部分。 这是贪婪的行为, 尽可能的意义来满足

当使用.+? ,而不是一次全部匹配并返回其他条件(如果有的话),引擎将逐一匹配下一个字符,直到匹配正则expression式的后续部分(如果有的话)。 这是非贪婪的 ,意思是尽可能满足的匹配。

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

在这之后,我们有(?= {contents} ) ,一个零宽度断言四处看看 。 这个分组结构匹配其内容,但不算作匹配的字符( 零宽度 )。 它只会返回,如果它匹配或不( 断言 )。

因此, /.+?(?=abc)/ ,正则expression式/.+?(?=abc)/是指:

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

如果你想捕捉所有的“abc”:

 /^(.*?)abc/ 

说明:

( )捕获使用$1$2等访问括号内的expression式

^比赛开始线

.*匹配任何东西, ? 非贪婪(匹配所需的最less字符数) – [1]

[1]这是需要的原因是,否则,在下面的string:

 whatever whatever something abc something abc 

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

正如@Jared Ng和@Issun所指出的那样,解决这种RegEx的关键就是“匹配某个字或子string的所有内容”或“匹配某个字或子string后的所有内容”被称为“lookaround”的零长度断言。 在这里阅读更多关于他们。

在您的具体情况下,可以通过积极的outlook来解决。 一张图片胜过千言万语。 请参阅截图中的详细说明。

Regex101截图

你需要的是看看周围的断言.+? (?=abc) .+? (?=abc)

请参阅: Lookahead和Lookbehind Zero-Length Assertions

注意[abc]abc不一样。 在括号内,它不是一个string – 每个字符只是其中一种可能性。 在括号之外它变成了string。

对于Java的正则expression式,我也相信在大多数正则expression式引擎,如果你想包括最后一部分这将工作:

 .+?(abc) 

例如,在这一行中:

 I have this very nice senabctence 

select所有字符,直到“abc”,还包括abc

使用我们的正则expression式,结果将是: I have this very nice senabc

testing一下: https : //regex101.com/r/mX51ru/1

我相信你需要子expression。 如果我没有记错,你可以使用normal ()方括号表示子expression式。

这部分是从grep手册:

  Back References and Subexpressions The back-reference \n, where n is a single digit, matches the substring previously matched by the nth parenthesized subexpression of the regular expression. 

做一些像^[^(abc)]应该做的伎俩。

这将有助于正则expression式。

  1. 确切的单词可以从下面的正则expression式中获得:

(“(。*?)“)/G

在这里,我们可以在全球范围内得到属于双引号内的确切单词。 例如,如果我们的search文本是,

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

那么我们会从这句话中“双引号”。

$标记了一个string的结尾,所以像这样的东西应该工作: [[^abc]*]$你在哪里寻找任何东西不终止在abc任何迭代,但它将不得不在末尾

另外,如果您正在使用正则expression式(如php或js)的脚本语言,他们有一个searchfunction,当它第一次遇到一个模式停止(你可以指定从左边开始或从右边开始,或用PHP,你可以做一个implode镜像string)。

尝试这个

 .+?efg 

查询:

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

输出:

 hijklmn