小编典典

如何在正则表达式中匹配“直到这个字符序列的任何内容”?

all

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

如果您在*其后添加一个“ /^[^abc]*/”,则正则表达式将继续将每个后续字符添加到结果中,直到它遇到一个a b
c

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

但是如果我想要匹配的字符串是"qwerty qwerty whatever "

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


阅读 127

收藏
2022-03-03

共1个答案

小编典典

您没有指定您正在使用哪种正则表达式,但这适用于任何可以被认为是“完整”的最流行的正则表达式。

/.+?(?=abc)/

这个怎么运作

该 部分是 (一个或多个任何东西).+? 的非贪婪版本
.+当我们使用.+时,引擎将基本匹配所有内容。然后,如果正则表达式中有其他内容,它将返回尝试匹配以下部分的步骤。这是 贪婪 的行为,意思
是尽可能地满足

当使用 .+?, 而不是一次匹配所有条件并返回其他条件(如果有)时,引擎将逐步匹配下一个字符,直到匹配正则表达式的后续部分(如果有)。这是 un-
greedy
,意思是匹配 最少的可能满足

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

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

接下来我们有 一个 零宽度断言环顾四周 。此分组结构匹配其内容,但不计为匹配的字符( 零宽度* )。它仅在匹配与否时才返回(
断言 )。(?= {contents})
***

因此,换句话说,正则表达式/.+?(?=abc)/意味着:

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

2022-03-03