正则表达式lookahead,lookbehind和原子组

我在我的正则表达式中找到了这些东西,但我没有弄清楚我可以使用它们。 有人有例子,所以我可以尝试了解他们如何工作?

(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind

(?>) - atomic group

例子

鉴于字符串foobarbarfoo

bar(?=bar)     finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar)     finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar    finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar    finds the 2nd bar ("bar" which does not have "foo" before it)

你也可以将它们组合起来:

(?<=foo)bar(?=bar)    finds the 1st bar ("bar" with "foo" before it and "bar" after it)

定义

向前看正面(?=)

查找表达式A其中表达式B如下:

A(?=B)

展望负面(?!)

查找表达式A表达式B不遵循的地方:

A(?!B)

看后面的正面(?<=)

查找表达式A表达式B在前:

(?<=B)A

看后面的负面(?<!)

查找表达式A表达式B不在先于:

(?<!B)A

原子团(?>)

原子组是一个非捕获组,它退出组并在组内模式的第一次匹配之后抛出所有替代方法,因此禁用回溯。

一个非原子组将允许回溯,它仍然会找到第一个匹配,那么如果提前匹配失败,它会回溯并找到下一个匹配,直到找到整个表达式的匹配或者所有可能性都用尽。

  • 表达式(foo|foot)s非原子组适用于foots

  • 匹配其第一备选物foo ,然后失败,因为s不紧跟在foots ,并回溯到它的第二选择;
  • 符合第2替代foot ,然后成功,因为s紧跟在foots ,并停止。
  • 应用于foots的表达式(?>foo|foot)s原子组将与其第一个备选foo匹配,然后由于s不会立即跟随而失败,并且禁用回溯时停止。

  • 一些资源

  • http://www.regular-expressions.info/lookaround.html
  • http://www.rexegg.com/regex-lookarounds.html

  • Lookarounds是零宽度断言。 他们检查正则表达式(向前或向后位置的当前位置的左侧或右侧),如果找到匹配项(基于正值还是负值),则成功或失败,并丢弃匹配的部分。 它们不消耗任何字符 - 跟在它们后面的正则表达式的匹配(如果有的话)将从相同的光标位置开始。

    阅读regular-expression.info获取更多细节。

  • 积极的前瞻:
  • 句法:

    (?=REGEX_1)REGEX_2
    

    仅当REGEX_1匹配时才匹配; 在匹配REGEX_1之后,匹配被丢弃并且搜索REGEX_2从相同的位置开始。

    例:

    (?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}
    

    REGEX_1是[a-z0-9]{4}$ ,它匹配四个字母数字字符,后跟行尾。
    REGEX_2是[az]{1,2}[0-9]{2,3} ,它匹配一个或两个字母,后跟两个或三个数字。

    REGEX_1确保字符串的长度确实是4,但不会消耗任何字符,因此搜索REGEX_2将从相同的位置开始。 现在REGEX_2确保该字符串符合其他一些规则。 如果没有预见,它会匹配三到五个字符串。

  • 消极向前看
  • 句法:

    (?!REGEX_1)REGEX_2
    

    仅当REGEX_1不匹配才匹配; 在检查REGEX_1之后,搜索REGEX_2将从相同的位置开始。

    例:

    (?!.*bFWORDb)w{10,30}$
    

    预见部分检查字符串中的FWORD ,如果发现它,则会失败。 如果它没有找到FWORD ,则FWORD成功,接下来的部分验证该字符串的长度在10到30之间,并且它只包含单词字符a-zA-Z0-9_

    后视与前瞻相似:它只是看在当前光标位置后面。 一些像javascript这样的正则表达式不支持隐藏断言。 支持它的大多数风格(PHP,Python等)都要求后台部分具有固定的长度。

  • 一旦令牌匹配,原子组基本上丢弃/忘记组中随后的令牌。 检查这个页面的原子组的例子

  • 迅速寻找目光。
    如何区分lookahead和lookbehind? 和我一起旅行2分钟:

    (?=) - positive lookahead
    (?<=) - positive lookbehind
    

    假设

        A  B  C #in a line
    

    现在,我们问B,你在哪里?
    B有两种解决方案来声明它的位置:

    一,B有A,并有C bebind
    二,B在C的后面(向后)并在后面(向后看)A.

    正如我们所看到的,后面和前面的两个解决方案是相反的。
    正则表达式是解决方案二。

    链接地址: http://www.djcxy.com/p/74791.html

    上一篇: Regex lookahead, lookbehind and atomic groups

    下一篇: Regex: not arbitrary non capturing group