正则表达式

406 阅读4分钟

正则表达式30分钟入门教程 | 菜鸟教程 (runoob.com) 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有想像中的那么困难。当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理,以后你还需要多练习,多使用,才能熟练掌握正则表达式。

除了作为入门教程之外,本文还试图成为可以在日常工作中使用的正则表达式语法参考手册。就作者本人的经历来说,这个目标还是完成得不错的——你看,我自己也没能把所有的东西记下来,不是吗?

Day1

特殊字符

元字符(常用)

  1. \b 单词的开头和结尾,只匹配一个位置
  2. . 匹配除了换行符以外的任何字符
  3. * 数量 *前面的内容可以连续重复使用任意次
  4. + 匹配重复1次或更多次
  5. ? 重复零次或一次
  6. \d 数字 eg. 0\d{2}-\d{8},012-34567890
  7. \s 空白符(空格,制表符(Tab),换行符,中文全角空格等)
  8. \w 匹配字母\数字\下划线\汉字
  9. \^\$ eg.QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$ 如果是:^\d{5,}$,代表5到更多位数字

字符类

  1. [0-9]
  2. [a-z0-9A-Z_] 等同于\w
  3. [aeiou] 匹配任何一个英文元音字母

下面是一个更复杂的表达式:(?0\d{2}[) -]?\d{8}

注意:"("和")"也是元字符,后面的分组节里会提到,所以在这里需要使用转义

这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行一些分析吧:首先是一个转义字符(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。

解决对应问题需要分支条件

转义

C:\\Windows 匹配 C:\Windows

分组

(\d{1,3}.){3}\d{1,3}

(\d{1,3}.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。

((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

反义

image.png

后向引用

(\d{4})([-/])\d{2}\2\d{2} 解释:

  • (\d{4}):捕获四位数字的年份。
  • ([-/]):捕获分隔符("-" 或 "/"),并将其存储在第二个捕获组中。
  • \d{2}:匹配两位数字的月份。
  • \2:引用第二个捕获组的内容,确保分隔符一致。
  • \d{2}:匹配两位数字的日期。

例如,字符串 "2023-01-01" 和 "2023/01/01" 会被匹配到,而 "2023-01/01" 不会被匹配到。

  1. 捕获组编号:捕获组的编号从1开始,按左括号出现的顺序递增。
  2. 命名捕获组:一些正则表达式引擎支持命名捕获组,可以通过名称来引用捕获的内容,例如 (?<name>pattern) 和 \k<name>
  3. 性能考虑:使用过多的捕获组和后向引用可能会影响正则表达式的性能,因此在实际应用中需要权衡使用。

零宽断言&负向零宽断言

总结

后向引用是正则表达式中非常有用的功能,能够帮助我们匹配重复模式和验证格式一致性。通过合理使用后向引用,可以大大提高正则表达式的灵活性和准确性。

测试工具