采用这个正则表达式:/^[^abc]/. 这将匹配字符串开头的任何单个字符,除了 a、b 或 c。
/^[^abc]/
如果您在*其后添加一个“ /^[^abc]*/”,则正则表达式将继续将每个后续字符添加到结果中,直到它遇到一个a、 或 b、 或 c。
*
/^[^abc]*/
a
b
c
例如,对于源字符串"qwerty qwerty whatever abc hello",表达式将匹配到"qwerty qwerty wh"。
"qwerty qwerty whatever abc hello"
"qwerty qwerty wh"
但是如果我想要匹配的字符串是"qwerty qwerty whatever "
"qwerty qwerty whatever "
…换句话说,我怎样才能将所有内容匹配到(但不包括) 确切的序列 "abc"?
"abc"
您没有指定您正在使用哪种正则表达式,但这适用于任何可以被认为是“完整”的最流行的正则表达式。
/.+?(?=abc)/
该 部分是 (一个或多个任何东西).+? 的非贪婪版本 。.+当我们使用.+时,引擎将基本匹配所有内容。然后,如果正则表达式中有其他内容,它将返回尝试匹配以下部分的步骤。这是 贪婪 的行为,意思 是尽可能地满足 。
.+?
.+
当使用 .+?, 而不是一次匹配所有条件并返回其他条件(如果有)时,引擎将逐步匹配下一个字符,直到匹配正则表达式的后续部分(如果有)。这是 un- greedy ,意思是匹配 最少的可能满足 。
/.+X/ ~ "abcXabcXabcX" /.+/ ~ "abcXabcXabcX" ^^^^^^^^^^^^ ^^^^^^^^^^^^ /.+?X/ ~ "abcXabcXabcX" /.+?/ ~ "abcXabcXabcX" ^^^^ ^
接下来我们有 一个 零宽度断言 , 环顾四周 。此分组结构匹配其内容,但不计为匹配的字符( 零宽度* )。它仅在匹配与否时才返回( 断言 )。(?= {contents}) ***
(?=
{contents}
)
因此,换句话说,正则表达式/.+?(?=abc)/意味着:
尽可能少地匹配任何字符,直到找到“abc”,不计算“abc”。