0
点赞
收藏
分享

微信扫一扫

正则表达式详解以及性能优化建议


首先我们先看正则表达式最关键的几个东西

  • 元字符-具有特殊意义的专用字符

元字符

描述

.

匹配除换行符以外的任意字符

\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开头的

1\d\d 100~199
[1-9]\d 10~99

  • 个位

[0-9] 0~9

需要根据匹配优先级去放置匹配参数
先匹配大的数字再匹配小的
那最后我们匹配ipv4的完整的表达式就是
((25[0-5]|2[0-4]\d|1\d\d| [1-9]\d|[0-9]).){3}(25[0-5]|2[0-4]\d|1\d\d| [1-9]\d|[0-9])

优化建议

  1. 使用字符组代替分支条件
    即使用[a-d] 不要使用(a|b|c|d)
  2. 优先选择最左端的匹配结果
  3. 标准量词是匹配优先的 贪婪模式下 量词会尽可能匹配更多的词
  4. 谨慎用点号元字符,尽可能不用星号和加号这样的任意量词
  5. 尽量使用字符串函数处理代替
  6. 合理使用括号
  7. 起始、行描点优化
  8. 量词等价转换的效率差异
  9. 对大而全的表达式进行拆分
  10. 使用正则以外的解决方案


举报

相关推荐

0 条评论