首先我们先看正则表达式最关键的几个东西
- 元字符-具有特殊意义的专用字符
| 元字符 | 描述 |
|---|---|
| . | 匹配除换行符以外的任意字符 |
| w | 匹配字母或数字或下划线或汉字 |
| s | 匹配任意空白符 |
| d | 匹配数字 |
| b | 匹配单词的开始或结束 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结束 |
| - | 表示范围 |
| [ ] | 匹配括号内任意一个字符 |
| * 、+、? | 量词 |
- 量词-量词也算是元字符
| 限定符代码/语法 | 语法 |
|---|---|
| * | 重复0次或更多次 |
| + | 重复1次或更多次 |
| ? | 重复0次或1次 |
| {n} | 重复n次 |
| {n,} | 重复n次或更多次 |
| {n,m} | 重复n到m次 |
反义词
| 常用反义 | 语法 |
|---|---|
| W | 匹配不是字母或数字或下划线或汉字 |
| S | 匹配任意不是空白符的字符 |
| D | 匹配不是数字 |
| B | 匹配不是单词开头或者借宿的位置 |
| [^x] | 匹配除了x以外的任意字符 |
懂了上面的这些东西 还有一个转义符 就是如果要查找元字符本身 就需要加个
现在我们开始写一个匹配ipv4地址的正则表达式
ip地址最大为255.255.255.255
我们首先去匹配1~255这个区间的数字
我们需要拆分1~255
- 2开头的
25[0-5] 250~255
2[0-4]d 200~249
- 1开头的
1dd 100~199
[1-9]d 10~99
- 个位
[0-9] 0~9
需要根据匹配优先级去放置匹配参数
先匹配大的数字再匹配小的
那最后我们匹配ipv4的完整的表达式就是
((25[0-5]|2[0-4]d|1dd| [1-9]d|[0-9]).){3}(25[0-5]|2[0-4]d|1dd| [1-9]d|[0-9])
优化建议
- 使用字符组代替分支条件
即使用[a-d] 不要使用(a|b|c|d) - 优先选择最左端的匹配结果
- 标准量词是匹配优先的 贪婪模式下 量词会尽可能匹配更多的词
- 谨慎用点号元字符,尽可能不用星号和加号这样的任意量词
- 尽量使用字符串函数处理代替
- 合理使用括号
- 起始、行描点优化
- 量词等价转换的效率差异
- 对大而全的表达式进行拆分
- 使用正则以外的解决方案
最后
以上就是悲凉含羞草最近收集整理的关于正则表达式详解以及性能优化建议的全部内容,更多相关正则表达式详解以及性能优化建议内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复