Skip to main content

正则表达式:快速综合匹配

yak 支持的正则表达式写法很多,有忠诚于标准库的写法,同时有高度封装的更易用的写法

我们这篇文章讲介绍作者最推荐的几种文本匹配的写法

func str.MatchAllOfGlob(origin, globPattern1, globPattern2) return boolfunc str.MatchAnyOfGlob(origin, globPattern1, globPattern2) return bool
func str.MatchAllOfRegexp(origin, rePattern1, rePattern2) return boolfunc str.MatchAnyOfRegexp(origin, rePattern1, rePattern2) return bool
func str.MatchAllOfSubString(origin, sub1, sub2) return boolfunc str.MatchAnyOfSubString(origin, sub1, sub2) return bool

这六个函数可以极大方便大家进行规则的编写,可以分别支持对 glob 语法 regexp 语法,以及子字符串匹配。

All 的逻辑是说,所有的规则都应该被匹配,才会返回 true,否则返回 false

Any 的逻辑是说,至少一条规则被匹配,将会返回 true,否则返回 false,如果没有规则,则返回 false

单个正则匹配文本#

result = str.MatchAllOfRegexp(`GET / HTTP/1.1Host: www.baidu.com
`, `Host: [w]{3}\.baidu\.com`)if result {    println("matched")}

在这个场景下,上述规则可以等同于 re.Match

多个正则同时用于匹配文档#

多个正则同时用于匹配一个文档时,通常会有 AND / OR 两种情况。 为此,我们稍微改一下上面的代码,让它变成匹配两个正则,都匹配才可以返回 true

多正则匹配:AND 场景#

data = `GET / HTTP/1.1Host: www.baidu.com
`result = str.MatchAllOfRegexp(data, `Host: [w]{3}\.baidu\.com`, `HTTP\/1\.1`)if result {    println("matched")}

多正则匹配:OR 场景#

data = `GET / HTTP/1.1Host: www.baidu.com
`result = str.MatchAnyOfRegexp(data, `Host: [w]{3}\.baidu\.com`, `HTTP\/1\.1`)if result {    println("matched")}