Java中的正则表达式

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
[Jj]ava
匹配java、Java

分组匹配

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)); // 输出Java
System.out.println(matcher.group(2)); // 输出iJava
}

Java中的正则表达式
https://probiecoder.cn/java/regexp.html
作者
duwei
发布于
2025年4月22日
许可协议