• 正则表达式的先行断言(lookahead)和后行断言(lookbehind)


    https://www.cnblogs.com/chip/p/4278135.html

    正则表达式的先行断言和后行断言一共有4种形式: 
    (?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion) 
    (?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion) 
    (?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion) 
    (?<!pattern) 零宽负向后行断言(zero-width negative lookbehind assertion) 
    这里面的pattern是一个正则表达式。

    如同^代表开头,$代表结尾,代表单词边界一样,先行断言和后行断言也有类似的作用,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为“零宽”。所谓位置,是指字符串中(每行)第一个字符的左边、最后一个字符的右边以及相邻字符的中间(假设文字方向是头左尾右)。 
    下面分别举例来说明这4种断言的含义。

    (?=pattern) 正向先行断言 
    代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。 
    例如对”a regular expression”这个字符串,要想匹配regular中的re,但不能匹配expression中的re,可以用”re(?=gular)”,该表达式限定了re右边的位置,这个位置之后是gular,但并不消耗gular这些字符,将表达式改为”re(?=gular).”,将会匹配reg,元字符.匹配了g,括号这一砣匹配了e和g之间的位置。

    (?!pattern) 负向先行断言 
    代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。 
    例如对”regex represents regular expression”这个字符串,要想匹配除regex和regular之外的re,可以用”re(?!g)”,该表达式限定了re右边的位置,这个位置后面不是字符g。负向和正向的区别,就在于该位置之后的字符能否匹配括号中的表达式。

    (?<=pattern) 正向后行断言 
    代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配pattern。 
    例如对”regex represents regular expression”这个字符串,有4个单词,要想匹配单词内部的re,但不匹配单词开头的re,可以用”(?<=w)re”,单词内部的re,在re前面应该是一个单词字符。之所以叫后行断言,是因为正则表达式引擎在匹配字符串和表达式时,是从前向后逐个扫描字符串中的字符,并判断是否与表达式符合,当在表达式中遇到该断言时,正则表达式引擎需要往字符串前端检测已扫描过的字符,相对于扫描方向是向后的。

    (?<!pattern) 负向后行断言 
    代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配pattern。 
    例如对”regex represents regular expression”这个字符串,要想匹配单词开头的re,可以用”(?<!w)re”。单词开头的re,在本例中,也就是指不在单词内部的re,即re前面不是单词字符。当然也可以用”re”来匹配。

  • 相关阅读:
    搜狗输入法--评价
    课堂练习--找水王
    学习进度条---第十二周
    Java接口与继承动手动脑
    Java数组课后作业
    Java语言String字符串课后作业
    Java类和对象课后作业
    Java语言第四讲
    Java语法基础----课后实践作业
    Java课堂作业-------参数求和
  • 原文地址:https://www.cnblogs.com/shiyublog/p/10710620.html
Copyright © 2020-2023  润新知