1、语法概述
参考 Java 核心技术:
2、基本语法
2.1 字符
[ABC]
:匹配 A | B | C
[^ABC]
:不匹配 A | B | C
[A-Z]
:匹配 A - Z
.
:匹配除换行符之外的任何字符,等价于[^\n\r]
,如果设置了s
标志,则表示任何字符
\s
:匹配空白字符
\S
:匹配非空白字符
\w
:匹配字母、数字和下划线,等价于[A-Za-Z0-9_]
注意,匹配特殊字符需要进行转义。
2.2 量词
{n}
:匹配 n 次
{n,}
:最少匹配 n 次
{n,m}
:最少匹配 n 次,最多匹配 m 次
*
:匹配零次或多次,等价于{0,}
+
:匹配一次或多次,等价于{1,}
?
:匹配零次或一次,等价于{0,1}
*
或+
都是贪婪匹配的,可以在它们后面加上?
,实现最小匹配:
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile(".*e");
Matcher matcher = pattern.matcher("Regular Expression");
while(matcher.find()) {
System.out.println(matcher.group(0));
}
System.out.println("----------");
pattern = Pattern.compile(".*?e");
matcher = pattern.matcher("Regular Expression");
while(matcher.find()) {
System.out.println(matcher.group(0));
}
}
}
运行结果:
Regular Expre
----------
Re
gular Expre
2.3 边界匹配
^
:匹配字符串的开始位置,如果设置了m
标志,将匹配每行的开始位置
$
:匹配字符串的结束位置,如果设置了m
标志,将匹配每行的结束位置
\b
:匹配单词的边界,放在字符之前表示匹配单词开头,反之匹配单词结尾
\B
:匹配非单词边界,即单词内部
2.4 群组
(X)
:捕获 X 的匹配
\n
:第 n 组
(?<name>X)
:捕获与给定名字匹配的 X
\k<name>
:具有给定名字的组
(?:X)
:使用括号但是不捕获 X
2.5 标志
i
:匹配时不区分大小写
m
:多行匹配,使定位符^
和$
匹配每行的开头和结尾
s
:使符号.
匹配的字符包含换行符
3、匹配字符串
要求字符串全部匹配时,使用matcher.matches()
判断:
public class Main {
public static void main(String[] args) {
// 将给定的正则表达式编译为模式
Pattern pattern = Pattern.compile("(([1-9]|1[0-2]):([0-5][0-9]))[ap]m"
, Pattern.CASE_INSENSITIVE);
// 创建一个将根据此模式匹配给定输入的匹配器
Matcher matcher = pattern.matcher("11:59AM");
// 是否全部匹配
if(matcher.matches()) {
// 获取第一个匹配字符的偏移量
int start = matcher.start();
// 获取最后一个匹配字符之后的偏移量
int end = matcher.end();
System.out.println(start + " " + end);
// 返回捕获的群组数量
int count = matcher.groupCount();
for(int i = 0; i <= count; i++) {
// 输出捕获的群组
System.out.print(matcher.group(i) + " ");
}
}
}
}
运行结果:
0 7
11:59AM 11:59 11 59
获取匹配的子字符串时,使用matcher.find()
:
public class Main {
public static void main(String[] args) {
// 将给定的正则表达式编译为模式
Pattern pattern = Pattern.compile("(([1-9]|1[0-2]):([0-5][0-9]))[ap]m"
, Pattern.CASE_INSENSITIVE);
// 创建一个将根据此模式匹配给定输入的匹配器
Matcher matcher = pattern.matcher("--11:59am--5:30PM--");
// 查找部分匹配
while (matcher.find()) {
// 获取第一个匹配字符的偏移量
int start = matcher.start();
// 获取最后一个匹配字符之后的偏移量
int end = matcher.end();
System.out.print(start + " " + end + " ");
// 输出匹配的字符串
System.out.println(matcher.group(0));
}
}
}
运行结果:
2 9 11:59am
11 17 5:30PM
4、分割字符串
示例代码:
public class Main {
public static void main(String[] args) {
String str = "1, 2, 3 ,4 , 5";
String[] split = str.split("\\s*,\\s*");
System.out.println(Arrays.toString(split));
}
}
运行结果:
[1, 2, 3, 4, 5]
5、替换字符串
示例代码:
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("[0-9]+");
Matcher matcher = pattern.matcher("192.168.167.14");
String result = matcher.replaceAll("#");
System.out.println(result);
}
}
运行结果:
#.#.#.#
如有错误,欢迎指正。.... .- ...- . .- -. .. -.-. . -.. .- -.-- -.-.--