一文搞懂正则表达式,不懂来打我

54 阅读5分钟

1、什么是正则表达式?

正则表达式(Regular Expression):正则表达式也称为规则表达式,是一种文本模式,包含普通字符和特殊字符(元字符),用来匹配和处理文本的字符串。

主要有两个用途:搜索和替换,用来对符合正则表达式规则字符串进行文本搜索和文本替换操作。

语法特点:

  1. 字母区分大小写;
  2. 元字符作为普通字符使用时,需要在字符前加上转义符(反斜杠\);

2、正则表达式语法

序号元字符描述备注示例文本表达式示例结果
1\转义符,将特殊字符表示为普通字符\ 作为普通字符时,需要使用转义符标识,\\file\1 file\2file\\1file\1
2.通配符,可以匹配任何一个单个字符. 作为普通字符时,需要使用转义符标识,\.a1.txt a2.txt b1.txta.\.txta1.txt a2.txt
3[]集合符,表示字符集合,匹配与字符集合里的任意一个成员相匹配的文本[] 作为普通字符,需要使用转义符标识,\[\]a1.txt b1.txt c1.txt[ab].*\.txta1.txt b1.txt
4-连字符,表示字符区间,结合集合符[]可以表示字符区间- 在[]内时,作为特殊字符,在[]外出现时,作为普通字符a1.txt a2.txt b1.txt[a-z].\.txta1.txt a2.txt b1.txt
5取非符,表示字符区间取非,结合集合符[]可以表示非字符区间^ 在[]内时,作为特殊字符,在[]外出现时,作为普通字符a1.txt ab.txt b1.txt[a-z][^0-9]\.txtab.txt
空白字符
6.1\d数字符,等价于[0-9]d未加\时,作为普通字符使用a1 a2 aba\da1 a2
6.2\D非数字符,等价于[^0-9]D未加\时,作为普通字符使用a1 a2 aba\Dab
7.1\w字母、数字和下划线符,等价于[a-zA-Z0-9_]w未加\时,作为普通字符使用a1 A1 ab a# a_\w\wa1 A1 ab a_
7.2\W非字母、数字和下划线符,等价于[^a-zA-Z0-9_]W未加\时,作为普通字符使用a1 A1 ab a# a_\w\Wa#
8.1\s空白符,等价于[\f\n\r\t\v]s未加\时,作为普通字符使用
8.2\S非空白符,等价于[^\f\n\r\t\v]S未加\时,作为普通字符使用
9+重复至少1个字符或子表达式不配0个字符或子表达式的情况10 200 abc[0-9]+10 200
10*重复至少0个字符或子表达式与+的区别,匹配0的情况10 20 adb[0-9][a-z]10 200 adb
11?重复0或1个字符或子表达式匹配重复0和1次的情况a 2a adb[0-9]+[a-z]?2a
12.1{m,n}重复m到n次字符或子表达式,m:最小次数, n: 最大次数m和n为非负整数,其中m<=n,最少匹配m次且最多匹配m次aa 2a aaadba{2,3}aa aaadb
12.2{m}重复m次字符或子表达式m为非负整数,精确匹配重复m次的情况aa 2a aaadba{3}aaadb
12.3{m,}至少重复m次字符或子表达式,m:最小次数m为非负整数,匹配重复m次的情况aa 2a aaadba{2,}aa aaadb
13()子表达式括弧包裹部分属于一个整体,可以对其进行重复等匹配abab 2a adb ababab(ab){2,3}abab ababab
14^ $^: 字符串起始标识;$: 字符串结束标识<?xml version="1.0" encoding="utf-8"?>^\S*<?xml.?>\S$<?xml version="1.0" encoding="utf-8"?>

3、实战

3.1、电子邮件表达式

  • 电子邮件地址:jaymz.yang@123.com
  • 正则表达式:(\w+\.)\w*@(\w+.)+[A-Za-z]+
  • 解析:(\w+\ .)*\w+负责匹配电子邮件地址里的用户名部分(@之前的所有文本):(\w+\ .)*匹配一些由.结束的文本的零次或多次重复出现,\w+匹配必不可少的文本(这个组合将匹配jaymz和jaymz.yang,等等)。接下来,@匹配@字符本身,(\w+\ .)匹配至少一个以.结束的字符串,[A-Za-z]+匹配至少一个字符的顶级域名(com、edu、us或uk,等等)。

3.2、IP地址表达式

  • IP地址:127.0.0.1
  • 正则表达式:(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}(\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])
  • 分析:由4个子表达式构成,这几个子表达式通过|操作符结合为一个更大的子表达式(其含义是只须匹配这4个子表达式之一即可)。随后的\ .用来匹配.字符,它与前4个子表达式构成的子表达式又构成了一个更大的子表达式,而接下来的{3}表明需要重复3次。最后,数值范围又重复了一次(这次省略了尾部的\ .)以匹配IP地址里的最后一组数字。通过把4组以.分隔的数字的取值范围都限制在0~255之间,这个模式准确无误地做到了只匹配合法的IP地址,但不匹配非法的IP地址。
  • 拆解分析4个子表达式((\d{1, 2})|(1\d{2})|(2[0-4]\d)|(25[0-5])\.)
    • 表达式1(\d{1, 2})匹配任意一位或两位数字(0~99)
    • 表达式2(1\d{2})匹配以1开头的任意三位数字(100~199)
    • 表达式3(2[0-4]\d)匹配整数200~249
    • 表达式4(25[0-5])匹配整数250~255

3.3、URL表达式

  • URL地址:www.sojson.com/regex c.runoob.com/front-end/8…
  • 正则表达式:https?://[-\w.]+(:\d*)?(/(([\w./_])*)?)?
  • 分析:https?://匹配http: //或https: //(?使得字符s是可选的)。[-\w.]+匹配主机名。(:\d+)?匹配一个可选的端口号。(/([\w/_.]*)?)?负责匹配一个文件路径:外层的子表达式匹配一个可选的/字符,内层的子表达式匹配那个文件路径本身。

4、写在最后

注意:使用正则表达式的时候,你将发现几乎所有的问题都有不止一种解决方案。它们有的比较简单,有的比较快速,有的兼容性更好,有的功能更全。在编写正则表达式的时候,只有对、错两种选择的情况是相当少见的 —— 同一个问题往往会有多种解决方案。