如何在正则expression式中匹配“直到这个字符序列的任何东西”?
采取这个正则expression式: /^[^abc]/
。 这将匹配string开头的任何单个字符,除了a,b或c。
如果在它后面添加*
,则正则expression式将继续将每个后续字符添加到结果中,直到遇到a
, b
或 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来解决。 一张图片胜过千言万语。 请参阅截图中的详细说明。
你需要的是看看周围的断言.+? (?=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式。
- 确切的单词可以从下面的正则expression式中获得:
(“(。*?)“)/G
在这里,我们可以在全球范围内得到属于双引号内的确切单词。 例如,如果我们的search文本是,
这是“双引号”单词的例子
那么我们会从这句话中“双引号”。
$
标记了一个string的结尾,所以像这样的东西应该工作: [[^abc]*]$
你在哪里寻找任何东西不终止在abc
任何迭代,但它将不得不在末尾
另外,如果您正在使用正则expression式(如php或js)的脚本语言,他们有一个searchfunction,当它第一次遇到一个模式停止(你可以指定从左边开始或从右边开始,或用PHP,你可以做一个implode镜像string)。
尝试这个
.+?efg
查询:
select REGEXP_REPLACE ('abcdefghijklmn','.+?efg', '') FROM dual;
输出:
hijklmn