1、什么是正则表达式?
正则表达式(Regular Expression):正则表达式也称为规则表达式,是一种文本模式,包含普通字符和特殊字符(元字符),用来匹配和处理文本的字符串。
主要有两个用途:搜索和替换,用来对符合正则表达式规则字符串进行文本搜索和文本替换操作。
语法特点:
- 字母区分大小写;
- 元字符作为普通字符使用时,需要在字符前加上转义符(反斜杠\);
2、正则表达式语法
序号 | 元字符 | 描述 | 备注 | 示例文本 | 表达式 | 示例结果 |
---|---|---|---|---|---|---|
1 | \ | 转义符,将特殊字符表示为普通字符 | \ 作为普通字符时,需要使用转义符标识,\\ | file\1 file\2 | file\\1 | file\1 |
2 | . | 通配符,可以匹配任何一个单个字符 | . 作为普通字符时,需要使用转义符标识,\. | a1.txt a2.txt b1.txt | a.\.txt | a1.txt a2.txt |
3 | [] | 集合符,表示字符集合,匹配与字符集合里的任意一个成员相匹配的文本 | [] 作为普通字符,需要使用转义符标识,\[\] | a1.txt b1.txt c1.txt | [ab].*\.txt | a1.txt b1.txt |
4 | - | 连字符,表示字符区间,结合集合符[]可以表示字符区间 | - 在[]内时,作为特殊字符,在[]外出现时,作为普通字符 | a1.txt a2.txt b1.txt | [a-z].\.txt | a1.txt a2.txt b1.txt |
5 | 取非符,表示字符区间取非,结合集合符[]可以表示非字符区间 | ^ 在[]内时,作为特殊字符,在[]外出现时,作为普通字符 | a1.txt ab.txt b1.txt | [a-z][^0-9]\.txt | ab.txt | |
空白字符 | ||||||
6.1 | \d | 数字符,等价于[0-9] | d未加\时,作为普通字符使用 | a1 a2 ab | a\d | a1 a2 |
6.2 | \D | 非数字符,等价于[^0-9] | D未加\时,作为普通字符使用 | a1 a2 ab | a\D | ab |
7.1 | \w | 字母、数字和下划线符,等价于[a-zA-Z0-9_] | w未加\时,作为普通字符使用 | a1 A1 ab a# a_ | \w\w | a1 A1 ab a_ |
7.2 | \W | 非字母、数字和下划线符,等价于[^a-zA-Z0-9_] | W未加\时,作为普通字符使用 | a1 A1 ab a# a_ | \w\W | a# |
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 aaadb | a{2,3} | aa aaadb |
12.2 | {m} | 重复m次字符或子表达式 | m为非负整数,精确匹配重复m次的情况 | aa 2a aaadb | a{3} | aaadb |
12.3 | {m,} | 至少重复m次字符或子表达式,m:最小次数 | m为非负整数,匹配重复m次的情况 | aa 2a aaadb | a{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、写在最后
注意:使用正则表达式的时候,你将发现几乎所有的问题都有不止一种解决方案。它们有的比较简单,有的比较快速,有的兼容性更好,有的功能更全。在编写正则表达式的时候,只有对、错两种选择的情况是相当少见的 —— 同一个问题往往会有多种解决方案。
- 参考文档:tool.oschina.net/uploads/api…
- 正则表达式在线测试地址:c.runoob.com/front-end/8…