1、正则表达式语法
表达式 |
描述 |
示例 |
字符 |
|
|
. |
除换行符以外的任何字符,或者在DOTALL设置时表示任意字符 |
单独字符中的点不需要转义,后边跟着量词才有意义 |
\a,\e,\f,\n,\r,\t |
响铃符,转义符,换页符,换行符,回车符,指标符 |
\n |
字符类 |
|
|
[^...] |
某个字符类的补集 |
[^\d\s] |
[...&&...] |
字符集的交集 |
[\p{L}&&[^A-Za-z]] |
\d,\D |
数字[0-9]\d+;它的补集 |
|
\w,\W |
单词字符[a-zA-Z0-9];它的补集 |
|
\s,\S |
空白字符[ \n\r\t\f\x{8}];他的补集 |
|
\h,\v,\H,\V |
水平空白字符、垂直空白字符;他们的补集 |
|
群组 |
|
|
(X) |
捕获X的匹配 |
([^']*) 捕获的是被引用的文本 |
\n |
第n 组 |
(['"]).*\1 可以匹配'Fred' 和"Fred" ,但是不能匹配"Fred' |
量词(默认为贪婪模式,尽可能的匹配) |
|
|
X? |
0或1次 |
|
X* |
出现0次或多次 |
|
X+ |
至少出现一次 |
|
X{n},X{n,},X{n,m} |
n个X,至少n个X,n到m个X |
|
Q? ,其中Q是一个量词表达式 |
非贪婪模式,先尝试匹配最短模式,Q是一个无上限的量词 |
{3} :只匹配123 , {3,} :默认匹配全部123... ,{3,} :匹配123 |
边界匹配 |
|
|
^,$ |
输入的开头和结尾 |
|
\A,\Z,\z |
输入的开头,输入的结尾,输入的绝对结尾 |
|
\b,\B |
单词边界,非单词边界 |
|
R |
Unicode行分隔符 |
|
\G |
前一个匹配的结尾 |
|
其他 |
|
|
- |
范围表示 |
0-3表示0,1,2,3 |
2、编译标志
Pattern.compile("", Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE)
标志 |
描述 |
Pattern.CASE_INSENSITIVE或r |
匹配字符时忽略字母的大小写,默认只考虑US ASCII 字符 |
Pattern.UNICODE_CASE |
与CASE_INSENSITIVE 组合使用的时候,用Unicode 字母的大小写来匹配 |
Pattern.UNICODE_CHARACTER_CLASS或U |
选择Unicode 字符类代替POSIX ,其中蕴含了UNICODE_CASE |
Pattern.MULTILINE或m |
^和$匹配行的开头和结尾,而不是整个输入的开头和结尾 |
Pattern.UNIX_LINES或d |
在多行模式中匹配^ 和$ 时,只有\n 被识别成行终止符 |
Pattern.DOTALL或s |
**.**匹配所有字符,包含行终止符 |
Pattern.COMMENTS或x |
空白字符和注释(从#到行末尾)将被忽略 |
Pattern.LITERAL |
该模式将被逐字地采纳,必须精确匹配,因字母大小写而造成的差异除外 |
Pattern.CANON_EQ |
考虑Unicode 字符规范的等价性 |
3、示例
1 2
| String text = "This is my personal info. My cellphone " + "number 15301234567 and email probiecoder@gmail.com.Today i will learn regex";
|
简单数值匹配
默认模式-贪婪模式,尽可能的多匹配
1 2 3 4 5 6 7
| String regex = "\\d{3,}"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); if (matcher.find()) { System.out.println(matcher.group()); } 输出:15301234567
|
非贪婪模式
1 2
| 修改 regex = "\\d{3,}" 输出:153
|
email匹配
涉及到 或 的使用
限制email后缀 gmail.com qq.com 163.com
1 2 3 4 5 6 7
| String regex = "\\w{3,}@(gmail|qq|163).com"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); if (matcher.find()) { System.out.println(matcher.group()); } 输出: probiecoder@gmail.com
|
限定字符匹配区域[]
分组匹配
1 2 3 4 5 6 7 8 9 10
| String text = "java,Java,aJava,iJava"; String regex = "\\w+,(Java),aJava,(iJava)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); if (matcher.find()) { System.out.println(matcher.group()); System.out.println(matcher.groupCount()); System.out.println(matcher.group(1)); System.out.println(matcher.group(2)); }
|