最近学习了正则表达式,趁还热乎,写下这篇博客,记录一下。
一、正则表达式概念
正则表达式(英语:Regular Expression,在代码中常简写为regex)。
正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本,也可以用来提取字符串。几个常用的地方:验证输入(譬如手机号校验)、数据清洗(爬取网页并获取想要数据)、文字替换。
二、正则表达式的匹配规则
2.1常用字符
字符 | 描述 |
---|---|
[abc] | 代表匹配的是字符a 或 b 或 c |
[^abc] | 代表匹配除了 a、b 或 c以外的任何字符 |
[a-zA-Z] | 代表匹配a 到 z 或 A 到 Z |
[0-9] | 代表匹配0到9 |
[a-zA-Z_0-9] | 代表的字母或数字或下换线 |
. | 匹配一个任意字符。如果使用”.”的话,使用匹配规则”\.”来实现 |
\s | 匹配任意一个空白字符,空格、回车、制表符、换页符等都是空白字符。例如:a\sc 可以配 a\nc。 |
\d | 代表匹配0到9数字,相当于[0-9] |
\w | 代表的字母或数字或下划线,相当于[a-zA-Z_0-9] |
2.2定位符
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。 |
$ | 匹配输入字符串结尾的位置。 |
\b | 匹配一个字边界,即字与空格间的位置。(相当于单词之间的空格 ) |
\B | 非字边界匹配。 |
2.3限定符
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如: “lo*” 能匹配 “l” 以及 “loo”或更多o。 |
+ | 匹配前面的子表达式一次或多次。例如: “lo+” 能匹配 “lo” 以及 “loo”或更多o。 |
? | 匹配前面的子表达式零次或一次。例如: “lo?” 可以匹配 “l”,”lo”。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如: “l{2}”” 能匹配 “Hello”的”l”。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如: “o{2,}” 不能匹配 “lo” 中的 “o”,但能匹配 “looooo” 中的所有”o”。可以与*,+ 等价使用 “{0,}”,”{1,}”。 |
{n,m} | m和n均为非负整数,其中n<=m。最少匹配 n 次且最多匹配 m 次。例如:”o{1,3}” 将匹配 “looooool” 中的前三个”o”。”o{0,1}”” 等价于 “o?”。 |
2.4特殊字符
字符 | 描述 |
---|---|
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用”\(“和”\)”。 |
. | 匹配除换行符”\n”之外的任何单字符。要匹配”.”,请使用”\.”。 |
[ | 标记一个中括号表达式的开始。要匹配”[“,请使用”\[“。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如: “n” 匹配字符”n”。”\n” 匹配换行符。序列 “\\” 匹配 “\”,而”\(” 则匹配”(“。 |
{ | 标记限定符表达式的开始。要匹配”{“,请使用”\{“。 |
| | 指明两项之间的一个选择。要匹配”|”,请使用”\|”。 |
2.5 逻辑分支
字符 | 描述 |
---|---|
a|b | 匹配 a 或 b。例如:”abc|cde” 能匹配 “abc” 或 “cde”。”(g|f)ood” 则匹配 “good” 或 “food”。 |
2.6非打印符
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如: \cM 匹配一个 Control-M 或回车符。 |
\f | 匹配一个换页符。 |
\n | 匹配一个换行符。 |
\r | 匹配一个回车符。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。 |
\S | 匹配任何非空白字符。 |
\t | 匹配一个制表符。 |
\v | 匹配一个垂直制表符。 |
三、常用正则举例
根据对应语言,譬如说Java,需要增加转义字符”\”来将”\”的功能启用
简单的手机号匹配: “^[1]\d{10}$”
表示从头开始匹配,第一个数字为1,后面跟10个数字。
精确的手机号匹配: “^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])\d{8}$”
匹配当前各大运营商对应的手机号。
身份证匹配: “^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9Xx])$”
匹配目前使用的18位身份证。
- 使用字母,数字组成的20位密码: “^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$”
匹配有字母(不区分大小写),数字组成的6-20位字符,一般用来验证密码。 QQ号: “^[1-9][0-9]{4,}$”
匹配5位意思的QQ号。
组织机构代码: “^[A-Za-z0-9]{8}-[A-Za-z0-9]{1}”
匹配由8位数字或字母加上一个”-“再加一位数字或字母的组织机构代码
这里分享一个Java的正则表达式工具类:
链接: https://pan.baidu.com/s/1o9yMowa 密码: 8qvk