为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2019-07-23 16:07:50
如何在正则表达式中匹配“直到这个字符序列”的任何内容?拿这个正则表达式:/^[^abc]/。这将匹配字符串开头的任何单个字符,a,b或c除外。如果你*在它之后添加- /^[^abc]*/- 正则表达式将继续将每个后续字符添加到结果中,直到它遇到a a,或 b,或 c。例如,使用源字符串"qwerty qwerty whatever abc hello",表达式将匹配"qwerty qwerty wh"。但是如果我想要匹配的字符串呢? "qwerty qwerty whatever "...换句话说,我怎样才能匹配到(但不包括)确切序列的所有内容 "abc"?
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

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

/.+?(?=abc)/

这个怎么运作

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

使用时 .+?,引擎将不是一次匹配并返回其他条件(如果有的话),引擎将逐步匹配下一个字符,直到匹配正则表达式的后续部分(如果有的话)。这是不贪婪的,意味着 尽可能少地满足

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

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

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

因此,在其他方面,正则表达式/.+?(?=abc)/意味着:

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


查看完整回答
反对 回复 2019-07-23
?
呼唤远方

TA贡献1856条经验 获得超11个赞

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

/^(.*?)abc/

说明:

( )使用捕获的括号内的访问的表达$1$2等等。

^ 匹配线的开始

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

[1]需要这样做的原因是,否则,在以下字符串中:

whatever whatever something abc something abc

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


查看完整回答
反对 回复 2019-07-23
?
慕容森

TA贡献1853条经验 获得超18个赞

正如@Jared Ng和@Issun指出的那样,解决这种RegEx的关键是“匹配某个单词或子串的所有内容”或“匹配某个单词或子串后的所有内容”称为“环视”零长度断言。在这里阅读更多相关信息。

在您的特定情况下,可以通过积极展望来解决。一张图片胜过千言万语。请参阅屏幕截图中的详细说明。


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 1579 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信