正则获取特定内容之零宽断言

在使用正则时,有时需要捕获特定内容,比如从下面test.txt文件内容中获取openid字段:

1
INFO - get user info from api:{"openid":"GGxxkkdsdfeq13xew","nickname":"一好","sex":1,"language":"zh_CN"}

这个时候就可以用到零宽断言:

1
cat test.txt | grep -Po '(?<=openid\"\:\")(.*?)(?=\")'

输出:

1
GGxxkkdsdfeq13xew

上面例子(?<=openid\"\:\")匹配需要捕获内容左边的字符openid":"(?=\")匹配内容右边的字符",中间(.*?)就是需要捕获的内容,括号里?用于使用非贪婪模式(即最短匹配)。

从上面例子看,零宽断言正如字面意思,零宽指零宽度匹配,最终匹配的内容不会保存到匹配结果中,断言指断定一个为真的事实,只有当断言为真时才会继续匹配。

零宽断言有以下几种:

1
2
3
4
(?=exp)   匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置

其中不带!为正向零宽断言,带!为负向零宽断言。

前面举了一个正向零宽断言的例子,下面举一个负向零宽断言例子。

还是文章开头那个test.txt文本。

1
INFO - get user info from api:{"openid":"GGxxkkdsdfeq13xew","nickname":"一好","sex":1,"language":"zh_CN"}

我们使用下面这个正则:

1
cat test.txt | grep -oP '(?<=\")(\w+)?(?!\")'

得到输出:

1
2
3
4
5
6
openi
GGxxkkdsdfeq13xe
nicknam
se
languag
zh_C

这个正则在这里没什么用处,只是单纯用于解释负向零宽断言的用法。

正则(?<=\")(\w+)?表示我们要找一个前面是"的一串字符串,(?!\")表示这串字符串的最后一个字符的后面不能为",所以我们可以看到结果字符串的最后一个字符匹配不到,因为最后一个字符的后面是"


- - END - -


腾讯云
0%