正则表达式学习笔记
文章目录
1. 语法
1.1 标准字符集合
- 注意:要区分大小写,大写是相反的意思
表达式 | 功能 |
---|---|
\d | 匹配任意一个数字,0~9中的任意一个 |
\w | 任意一个字母或数字或下划线,也就是AZ、az、0~9 |
\s | 包括空格、制表符、换行符等空白字符的任意一个 |
. | 小数点可以匹配任意一个字符(除了换行符) 如果要匹配包括"\n"在内的所有字符,一般用[\s\S] |
1.2 自定义字符集合
- [ ]方括号匹配方式,能够匹配方括号里面的任意一个字符
表达式 | 功能 |
---|---|
[a1@] | 匹配“a"、“1”、"@"中的任意一个字符 |
[^a1@] | 匹配“a"、“1”、"@"之外的任意一个字符(注意空格) |
[a-f1-3] | 匹配"a""f"和"1""3"中的任意一个字符(包含a、f、1、3) |
[^a-f1-3] | 匹配"a""f"和"1""3"之外的任意一个字符(包含a、f、1、3) |
[abcdef123]
和[a-f1-3]
含义相同- 如果正则表达式的特殊符号被包含到中括号[ ]中,则失去特殊意义,除了
^
和-
。- 标准字符集合中,除了小数点之外,如果被包含于中括号中,自定义字符集合将包含该集合。例如
[\d.\-+]
将匹配:\d
表示匹配数字、.
匹配小数点本身、-
用转义\-
表示、+
表示本身。
- 标准字符集合中,除了小数点之外,如果被包含于中括号中,自定义字符集合将包含该集合。例如
1.3 量词
- 修饰匹配次数的特殊符号
表达式 | 功能 |
---|---|
{n} | 重复n次 |
{m,n} | 至少重复m次,最多重复n次 |
? | 匹配表达式0次或1次,相当于{0,1} |
+ | 匹配表达式至少1次,相当于{1,} |
* | 表达式不出现或者出现任意次,相当于{0,} |
- 注意:
\d\d{6}
表示匹配7位数字,而不是12位,而(\d\d){6}
才表示匹配12位 - 贪婪模式–默认情况,匹配次数越多越好
- 非贪婪模式–匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个
?
号- 例如:
\d{3,6}?
当出现3个数字就匹配一次
- 例如:
- 举例:
a\d?b
表示匹配ab或ab中间有一个数字的字符串
1.4 字符边界
- 本组标记匹配的不是字符而是位置,符合某种条件的位置
表达式 | 功能 |
---|---|
^ | 与字符串开始的位置匹配 |
$ | 与字符串结束的位置匹配 |
\b | 匹配一个单词的边界 |
\b
匹配:前面的字符和后面的字符不全是\w(字母、数字、下划线)
- 例如
sen\b
:匹配sen
(n右边有一个空格)、不匹配sen1
- 例如
1.5 选择符和分组
表达式 | 功能 |
---|---|
分支结构:| | 左右两边表达式之间的”或“关系,匹配左边或右边 |
捕获组:() | 1. 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰 2. 取匹配结果时,括号中的表达式匹配到的内容可以被单独得到 3. 每一对括号会分配一个编号,使用 () 的捕获根据左括号的顺序从1开始自动编号。4. 捕获元素为0的第一个捕获是由整个正则表达式模式匹配的文本 |
非捕获组(?:表达式) | 1. 一些表达式中,不得不使用( ),但又不需要保存( )中子表达式匹配的内容,也就是不需要编号,此时可以使用非捕获组。 2. 不影响括号内表达式表达的结果 |
- 举例
([a-z]{2})\1
:可以从goto togo gogo toto
中匹配到gogo toto
- 说明:
[a-z]{2}
匹配到了2个字符go
或to
,加括号后分组并编号,\1
表示引用前面捕获组所捕获的内容
- 说明:
1.6 预搜索(零宽断言)
- 只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度。
- 这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符。是对位置的匹配。
- 正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的。
- 如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度(是对位置的匹配)的。
- 占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果中而言的。
表达式 | 功能 |
---|---|
(?=表达式) | 断言此位置的后面能匹配该表达式 |
(?<=表达式) | 断言此位置的前面能匹配该表达式 |
(?!表达式) | 断言此位置的后面不能匹配该表达式 |
(?<!表达式) | 断言此位置的前面不能匹配该表达式 |
- 举例
- 文本:
goding doing eating
正则:[a-z]+(?=ing)
- 匹配到:
go do eat
ing本身没有匹配到
- 文本:
1.7 正则表达式的匹配模式
- IGNORECASE 不区分大小写
- 默认情况下,正则表达式是区分大小写的
- SINGLELINE 单行模式
- 将整个文本看成一条字符串,意味着只有一个开头和一个结尾。
- 使得小数点
.
:可以匹配包含换行符\n
在内的任意字符
- MULTILINE 多行模式
- 每行都是一个字符串,都有开头和结尾
- 在该模式下,如果需要仅匹配整个文本字符串的开始和结束位置,可以使用
\A
和\Z
2. 常见例子
2.1 电话号码验证
- 要求:
- 电话号码由数字和 ” - ” 构成
- 电话号码为7到8位
- 如果电话号码中包含有区号,那么区号为三位或四位,首位是0.
- 区号用"-“和其他部分隔开
- 移动电话号码为11位
- 11位移动电话号码的第一位和第二位为“13",“15”,“18”
- 正则:
(0\d{2,3}-\d{7,9})|(1[3,5,8]\d{9})
2.2 邮箱验证
- 要求
- 用户名:字母、数字、中划线、下划线组成。
- 有@
- 网址:字母、小数点、数字组成。
- 组织域名:2-4位字母组成
- 不区分大小写
- 正则:
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
2.3 其他常见正则
要求 | 正则 |
---|---|
身份证 | \d{17}[\d|x]\d{15} |
QQ号 | [1-9]([0-9]{5,11}) |
用户名 | [A-Za-z0-9_\-\u4e00-\u9fa5]+ |
整数 | -?[1-9]\d* |
3.在开发环境中使用正则
3.1 数据库
- Mysql5.5以上
- Oracle10以上
- 例如
select name from user where name REGEXP '.000'(匹配任意字符);
3.2 java中使用正则
- 相关类位于java.util.regex包下
- 类Pattern
- 正则表达式的编译表达形式
Pattern p = Pattern.compile(”正则表达式“);//建立正则表达式并启用相应模式
- 类Mathcher
Matcher m = p.matcher(str);//匹配str字符串
Pattern- 正则表达式的编译表达形式
Pattern p = Pattern.compile(”正则表达式“);//建立正则表达式并启用相应模式
- 类Mathcher
Matcher m = p.matcher(str);//匹配str字符串
- 使用
str.split("正则表达式");//根据正则切割字符串
- 类Pattern