环视断言

    • = look around (assertion)
      • 包括
        • look ahead (assertion)=正向断言
          • positive lookahead assertion(?=xxx)
          • negative lookahead assertion(?!xxx)
        • look behind (assertion)=
          • positive lookbehind assertion(?<=xxx)
          • negative lookbehind assertion(?<!xxx)

    总体就2个逻辑:

    • 站在 当前所要匹配的内容
      • 往哪看
        • ahead:向前 向右 ➡️ 当前字符串继续往后的方向
          • 从左到右 叫做 向前,属于正向
        • behind:向左 ◀️ 向后 ⬅️ 当前字符串之前的方向
          • 所以会额外加上一个 <小于号 表示向后看的意思
            • (?<=xxx)
            • (?<!xxx)
      • positive/negative:
        • positive=正面的,肯定的,用 等于号=,意思是:
        • negative=负面的,否定的,用 不等于号!,意思是:!=xxx
    • positive lookahead assertion(?=xxx)
    • negative lookahead assertion(?!xxx)
    • positive lookbehind assertion(?<=xxx)
    • (?<!xxx)

    官网文档:

    代码详细解释:

    • name=(\w+):普通的group
      • 匹配结果
        • 5个都匹配
          • date=20191224&name=CrifanLi&language=python
          • language=python&name=CrifanLi&date=20191224
          • language=python&name=CrifanLi date=20191224
          • language=go&name=CrifanLi date=20191224
        • 匹配到内容都是:
          • name=CrifanLi
      • 解析:因为只是普通的(xxx)的组,没有限制,所以都能匹配到
    • name=(\w+)(?=&language):lookahead=positive lookahead=正向先行断言
      • 匹配结果
        • 只匹配了1个:
          • date=20191224&name=CrifanLi&language=python
        • 其余4个都不匹配
          • language=python&name=CrifanLi&date=20191224
          • language=python&name=CrifanLi date=20191224
          • language=go&name=CrifanLi date=20191224
          • language=go name=CrifanLi date=20191224
      • 解析:
        • (?=&language) 表示 后面一定是 &language
          • 而上面4个的后面,分别是:
            • &date=
            • date=
            • date=
            • date=
          • 所以都不匹配
    • name=(\w+)(?!&):negative look ahead=负向先行断言
      • 匹配结果
        • 5个都匹配到了,但是匹配的内容不一样
          • 2个匹配到了:name=CrifanL
            • date=20191224&name=CrifanLi&language=python
            • language=python&name=CrifanLi&date=20191224
          • 3个匹配到了:name=CrifanLi
            • language=python&name=CrifanLi date=20191224
            • language=go&name=CrifanLi date=20191224
            • language=go name=CrifanLi date=20191224
      • 解析
        • 因为(?!&)表示 后面不能是 &
          • 所以类似于
            • name=CrifanLi&language
            • name=CrifanLi&date
          • 这种,只能匹配到L,而不是i,因为i后面是&,此处要求后面不能是&
    • (?<=go&)name=(\w+):positive look behind=正向后行断言
      • 匹配结果
        • 只匹配到1个
          • language=go&name=CrifanLi date=20191224
      • 解析
        • 因为此处(?<=go&)意思是,前面一定要是 go& 所以只有这个匹配
        • 其他的
          • 20191224&name=
          • python&name=
          • python&name=
          • go name=
        • 中name=的前面 都不符合条件
    • (?<!&)name=(\w+):negative look behind=负向后行断言
      • 匹配结果
        • 只匹配到1个:
          • language=go name=CrifanLi date=20191224
      • 解析
        • 因为(?<!&)的意思是:前面不能是 &
          • 所以只有
            • go name=
          • 这个符合,而其余的
            • 20191224&name=
            • python&name=
            • python&name=
            • go&name=
          • name=前面都是&,所以不符合条件,不匹配

    官网解释:

    用代码详细解释: