正则表达式 零宽度断言
先行断言和后发断言都属于非捕获簇(不捕获文本 ,也不针对组合计进行计数)。
先行断言用于判断所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定格式(仅作为约束)。
例如,我们想要获得所有跟在 $ 符号后的数字,我们可以使用正后发断言 (?<=\$)[0-9\.]* 。
这个表达式匹配 $ 开头,之后跟着 0,1,2,3,4,5,6,7,8,9,. 这些字符可以出现大于等于 0 次。
零宽度断言如下:
符号 | 描述 |
---|---|
?= | 正先行断言-存在。 |
?! | 负先行断言-排除。 |
?<= | 正后发断言-存在。 |
?<! | 负后发断言-排除。 |
1. ?=... 正先行断言
?=... 正先行断言,表示第一部分表达式之后必须跟着 ?=... 定义的表达式。
返回结果只包含满足匹配条件的第一部分表达式。
定义一个正先行断言要使用 () 。在括号内部使用一个问号和等号: (?=...) 。
正先行断言的内容写在括号中的等号后面。
例如,表达式 (T|t)he(?=\sfat) 匹配 The 和 the ,在括号中我们又定义了正先行断言 (?=\sfat) ,即 The 和 the 后面紧跟着 (空格)fat 。
"(T|t)he(?=\sfat)" => The fat cat sat on the mat.
2. ?!... 负先行断言
负先行断言 ?! 用于筛选所有匹配结果,筛选条件为 其后不跟随着断言中定义的格式。
正先行断言 定义和 负先行断言 一样,区别就是 = 替换成 ! 也就是 (?!...) 。
表达式 (T|t)he(?!\sfat) 匹配 The 和 the ,且其后不跟着 (空格)fat 。
"(T|t)he(?!\sfat)" => The fat cat sat on the mat.
3. ?<= ... 正后发断言
正后发断言 记作 (?<=...) 用于筛选所有匹配结果,筛选条件为 其前跟随着断言中定义的格式。
例如,表达式 (?<=(T|t)he\s)(fat|mat) 匹配 fat 和 mat ,且其前跟着 The 或 the 。
"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
4. ?<!... 负后发断言
负后发断言 记作 (?<!...) 用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。
例如,表达式 (?<!(T|t)he\s)(cat) 匹配 cat ,且其前不跟着 The 或 the 。
"(?<!(T|t)he\s)(cat)" => The cat sat on cat.
标志也叫模式修正符,因为它可以用来修改表达式的搜索结果。这些标志可以任意的组合使用,它也是整个正则表达式的一部分。符号描述i忽略大小写。g全局搜索。m多行修饰符:锚点元字符 ^ $ 工作范围在每行的起始。 1. ...