语法
1.普通字符与转义字符
普通字符:包含字母、数字、汉字、下划线、以及没有定义的标点符号,在正则表达式中匹配与之相同的一个字符。
转义字符:
\n 换行符 \t 制表符 \\ \本身 \^ , \$ , \( , \) , \{ , \} , \? , \+ , \* , \| , \[ , \] 字符的本身
2. 标准字符集合
能够与‘多种字符’匹配的表达式,大写表示相反的意思
\d 任意一个数字(0-9) \w 任意一个字母、数字、下划线(A-Z,a-z,0-9,_) \s 任意一个空格、制表符、换行符等空白字符中的一个 . 匹配任意一个字符,但不包括换行符,可以用[\s\S]匹配任意一个字符 例:\d表示匹配任意一个0-9的数字,\D表示匹配任意一个不是数字的字符
3.自定义字符集合
[]方括号匹配方式,能够匹配方括号中的任意一个字符
注意:方括号中的特殊符号没有特殊含义,只代表字符本身,‘^’和‘-’除外
例:
- [ab5@]匹配‘a’或‘b’或‘5’或‘@’
- [^abc]匹配‘a’‘b’‘c’之外的任意一个字符
- [a-d]匹配a-d之间的任意一个字符
- [^A-F0-3]匹配A-F,0-3之外的任意一个字符
4. 量词
修饰字符匹配的次数
- 贪婪模式,达到匹配最小限制后也会一直往后匹配,直到最大限制(默认)
- 非贪婪模式,达到最小限制便重新开始匹配(在{}后加?)
{n} 重复n次 {m,n} 至少重复m次,最多重复n次 {m,} 至少重复m次,没有最大限制 ? 0次或1次,相当于{0,1}(与费贪婪模式的问号不同,
此问号跟在表达式之后不是{}之后)
+ 至少出现1次,相当于{1,} * 不出现或出现任意次,相当于{0,} 非贪婪模式与贪婪模式例:1234567890
- 贪婪模式:\d{3,5} 会匹配成12345和67890
- 非贪婪模式:\d{3,5}?会匹配成123、456、789,0不符合
?,+,*例:
- a\d?b会匹配如:ab,a1b,ab中有或没有1个数字的字符串
- a\d+b会匹配如:a1b,a123b,a123456b,ab中有至少一个数字的字符串
- a\d*b会匹配如:ab,a123445b,ab中有没有数字都行的
5.字符边界
本组标记匹配的不是字符而是位置,符合某种条件的位置,不占位置,是零宽的
^ 与字符串开头的地方匹配(与[]中的^不同,[]的^表示取反)
$ 与字符串结束的地方匹配 \b 匹配一个单词边界(前面的字符和后边的字符不全是\w,
即任意一个字母、数字、下划线)
例:
- ^a:会匹配以a开头的,^\d:会匹配以数字开头的
- a$:会匹配以a结尾的,\d$:会匹配以数字结尾的
- [a-z]{3}\b:会匹配字符串"abc","123abc"等符合[a-z]{3}该表达式的字符串的右边不为\w的字符串
- \b[a-z]{3}:会匹配字符串"abc","abc123"等,表达式左边不满足\w的字符串
6.选择符、分组和反向引用
选择符和分组:
|分支结构 左右两个表达式之间“或”关系,匹配左边或右边 ()捕获组 1.在被修饰匹配次数时,括号中的表达式被看做整体
2.取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
3.每一对括号会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号。捕获元素编号为零的第一个捕获是由整个整个正则表达式模式匹配的文本
(?:exp)非捕获组 表达式中不得不使用(),但又不需要保存()中表达式匹配的内容,这时可以用非捕获组来抵消()带来的副作用 反向引用:(\nnn)
- 每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1自动编号
- 通过反向引用,可以对分组已捕获的字符串进行引用
例:
([a-z]{2})\1:表达式[a-z]{2}可以匹配两个小写字母,表达式([a-z]{2})就是把获取到的数据存起来,然后\1的作用就是在把存起来的数据引用一遍,便可以得到"dodo","abab","cdcd"这样的重复的四位小写字母
7.预搜索(零宽断言)
- 只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度的
- 只匹配位置,不匹配字符,只匹配当前位置的前后字符是否符合条件
(?=exp) 断言自身出现的位置后边能匹配表达式exp (?<=exp) 断言自身出现的位置前边能匹配表达式exp (?!exp) 断言自身出现的位置后边不能匹配表达式exp (?<!exp) 断言自身出现的位置前边不能匹配表达式exp 例:
- [a-z]+(?=ing)匹配以ing结尾的小写字母组成的字符串
8.匹配模式
ignorecase忽略大小写(默认正则表达式是区分大小写的)
singleline单行模式(整个文本看成一个字符串,即只有一个开头一个结尾;使小数点“.”可以匹配到换行符)
multiline多行模式(每行都是一个字符串,每行都有开头结尾;可以使用\A和\Z匹配最开头和最后结尾)
常用:
正浮点数且保留两位小数
@Pattern(regexp = "(([1-9]\\d*)\\.(\\d{1,2}))|0\\.(\\d{1,2})|(\\d*)",message = "只支持正浮点数且不能有空格")