|
|

楼主 |
发表于 2023-1-17 09:34
|
显示全部楼层
本帖最后由 马黑黑 于 2023-1-17 09:43 编辑
三、正向后行断言
(?<=子表达式)表达式
例:
(?<=[一-龟])手机
正则表达式中的后行断言,指子表达式限制其后面将被匹配的主表达式,限制方向属向后限制,所以称为后行断言。
正向后行断言,亦即肯定后行后行断言,引导子表达式的符号为 ?<= ,这个符号可以这么理解以便快速记忆:
? 匹配方向是什么
< 向后
= 等于(肯定,即正向)
上例中的断言子表达式,[一-龟],意为:汉字一至龟所有字中的任意一个,这几乎包括了常用汉字了。[] 用于定义表达式的字符匹配范围,例如之前我们介绍过的 [0-9] 定义的字符匹配范围是 0 到 9 的任意一个数字,[a-zA-Z0-9] 则匹配大小写字母、数字中的任意一个。汉字在编码中也是基本连续存放的,“一”在汉字存放区域放在第一位,GBK汉字放在20902位的是“龥”子,该字不好输入,所以我们改用“龟”字,“龟”放在20896位,差不多囊括完GBK汉字了。
整个子表达式要用圆括号包裹起来,(?<=[一-龟]),意思是如果这个子表达式去匹配的目标字串存在从“一”到“龟”中的任意一个汉字,那么,目标字串就匹配这个子表达式,从而其后面的“手机”主表达式就能匹配。看,匹配子表达式的目的是为了限制主表达式的匹配范围,这就叫断言,它是往子表达式后面的主表达式断言的,所以叫后向断言,子表达式是以肯定形式去匹配(等于一个汉字),所以叫正向后行断言,正向就是肯定的意思。
如一楼所演示,(?<=[一-龟])手机 所能匹配的“手机”,也就是被标红的“手机”,“手机”前面必定是一个汉字,如果是其他的都统统不会标红,因为那样的话就不匹配。如果想匹配“手机”前面是非汉字的,咋办?试下这个表达式:
(?<=[^一-龟])手机
我们加了一个脱字符号 ^,这表示否定方括号里的选择范围,就是,不是汉字。
再试试:
(?<=\w)手机
效果一样。因为,\w 表示的范围是 [a-zA-Z0-9_],所有字母数字再加一个下划线。
再来试试这个:
(?<=\W)手机
在这里,效果就和 [一-龟] 一样,因为,\W 和 \w 相反,等价于 [^a-zA-Z0-9_],意思是,不是字母数字下划线。
倘若想设定精准一点的后向断言,比方说,我们要去匹配“手机”这个词汇,但它前面只能有两个汉字,那么,请试试:
(?<=^[一-龟]{2})手机
标红的结果会满足我们的设定。子表达式中,脱字符号 ^ 放在第一个方括号的左上角是个边界符号,表示句首,子表达式中的花括号 {2} 是限定前面表达式的匹配数量,也就是,一至龟的汉字中,要出现两个(可以重复,比如“黑黑手机”会被匹配到)。
|
评分
-
| 参与人数 1 | 威望 +50 |
金钱 +100 |
经验 +50 |
收起
理由
|
红影
| + 50 |
+ 100 |
+ 50 |
赞一个! |
查看全部评分
|