无题

正则匹配的原理

1. 正则表达式

基本每种语言都有自己的正则表达式库,

匹配字符

[abc] 匹配a,b,c中的任意一个字符
[^abc] 不匹配a,b,c中的所有字符,“^”只有作为第一个字符出现才有效
[a-g] 匹配a-g范围内的任意一个字符
[^a-g] 不匹配a-g中的所有字符
[H-N] 匹配H-N范围内的任意一个字符
[0-9] 匹配0-9范围内的任意一个字符
[a-gH-N] 匹配a-g,H-N范围内的任意一个字符
. ,匹配除换行符以外的任意字符
\s 匹配任意的空白符
\S [^\s]
\d 匹配数字
\D [^\d]
\w 匹配字母或数字
\W [^\w]

频次范围

* 重复零次或更多次{0,}
+ 重复一次或更多次{1,}
? 重复零次或一次{0,1}
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
\w* 贪婪模式
\w*? 非贪婪模式

定点符

^ 字符串开始符
$ 字符串结尾符
\b 匹配单词的开始或结束
\B 非单词边界
(exp) 匹配exp,并捕获文本到自动命名的组里
(?exp) 匹配exp,并捕获文本到名称为name的组里
(?:exp) 匹配exp,不捕获匹配的文本
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置

2. 状态机

自动机分为DFA和NFA,他们的不同点在于NFA存在多值映射和空值转移,如条件不存在start也可以转移到m_state状态

3. 正则表达式自动状态机构建

regex:((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3})

上面表达式为IP地址识别的正则表达式,如此长的一串字符,如何快速分析,图形是人类最擅长分析的,所以可以将上面的表达式转换成正则自动状态机图形,如上面的状态机一样,即可显而易见的了解其作用

说到这里,人工的构造必定是一个艰巨的工程,所以可以使用该网站帮我们快速构建 https://jex.im/regulexRegex正则表达式在线测试 - 正则表达式在线生成工具 - MKLab在线工具

进过构建得到如下所示的

由此可以明显的观察到正则表达式表示的含义,对于Group因为上面提到的 () 表示一个匹配组,可以忽略,主要可以用来字符替换使用