无题
无题
John Doe正则匹配的原理
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,并捕获文本到名称为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/regulex 、Regex正则表达式在线测试 - 正则表达式在线生成工具 - MKLab在线工具
进过构建得到如下所示的
由此可以明显的观察到正则表达式表示的含义,对于Group因为上面提到的 () 表示一个匹配组,可以忽略,主要可以用来字符替换使用
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果



