环视断言
- =
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)
- 所以会额外加上一个
- ahead:向前 向右 ➡️ 当前字符串继续往后的方向
- positive/negative:
- positive=正面的,肯定的,用 等于号
=
,意思是: - negative=负面的,否定的,用 不等于号
!
,意思是:!=xxx
- positive=正面的,肯定的,用 等于号
- 往哪看
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
- 5个都匹配
- 解析:因为只是普通的(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
- 只匹配了1个:
- 解析:
- (?=&language) 表示 后面一定是 &language
- 而上面4个的后面,分别是:
- &date=
- date=
- date=
- date=
- 所以都不匹配
- 而上面4个的后面,分别是:
- (?=&language) 表示 后面一定是 &language
- 匹配结果
- 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
- 2个匹配到了:name=CrifanL
- 5个都匹配到了,但是匹配的内容不一样
- 解析
- 因为(?!&)表示 后面不能是 &
- 所以类似于
- name=CrifanLi&language
- name=CrifanLi&date
- 这种,只能匹配到L,而不是i,因为i后面是&,此处要求后面不能是&
- 所以类似于
- 因为(?!&)表示 后面不能是 &
- 匹配结果
- (?<=go&)name=(\w+):positive look behind=正向后行断言
- 匹配结果
- 只匹配到1个
- language=go&name=CrifanLi date=20191224
- 只匹配到1个
- 解析
- 因为此处(?<=go&)意思是,前面一定要是 go& 所以只有这个匹配
- 其他的
- 20191224&name=
- python&name=
- python&name=
- go name=
- 中name=的前面 都不符合条件
- 匹配结果
- (?<!&)name=(\w+):negative look behind=负向后行断言
- 匹配结果
- 只匹配到1个:
- language=go name=CrifanLi date=20191224
- 只匹配到1个:
- 解析
- 因为(?<!&)的意思是:前面不能是 &
- 所以只有
- go name=
- 这个符合,而其余的
- 20191224&name=
- python&name=
- python&name=
- go&name=
- name=前面都是&,所以不符合条件,不匹配
- 所以只有
- 因为(?<!&)的意思是:前面不能是 &
- 匹配结果
官网解释:
用代码详细解释: