1 正则表达式简介
使用正则表达式的好处有哪些?
一个正则表达式就是一个描述规则的字符串,所以,只需要编写正确的规则,我们就可以让正则表达式引擎去判断目标字符串是否符合规则。
正则表达式是一套标准,它可以用于任何语言。Java 标准库的 java.util.regex
包内置了正则表达式引擎,在 Java 程序中使用正则表达式非常简单。
举个例子:要判断用户输入的年份是否是20##
年,我们先写出规则如下:
一共有 4 个字符,分别是:2
,0
,0~9任意数字
,0~9任意数字
。
对应的正则表达式就是:20\d\d
,其中\d
表示任意一个数字。
把正则表达式转换为 Jaa 字符串就变成了20\\d\\d
,注意Java字符串用\\
表示\
。
最后,用正则表达式匹配一个字符串的代码如下:
public class Main{
public static void main(String[] args){
String regex = "20\\d\\d";
System.out.println("2019".matches(regex)); // true
System.out.println("2100".matches(regex)); // false
}
}
可见,使用正则表达式,不必编写复杂的代码来判断,只需要给出一个字符串表达的正则规则即可。
2 匹配规则
正则表达式的匹配规则是从左到右规则匹配。我们首先来看如何使用正则表达式做精确匹配。
对于正则表达式abc
来说,它只能精确地匹配字符串"abc"
,不能匹配 “ab”, “Abc”, “abcd” 等其他任何字符串。
如果正则表达式有特殊字符,那就需要用\
转义。例如,正则表达式a\&c
来说,对应的 Java 字符串是"a\\&c"
,因为\
也是Java字符串的转义字符,两个\\
实际上表示的是一个\
:
public class Main {
public static void main(String[] args) {
String re1 = "abc";
System.out.println("abc".matches(re1));
System.out.println("Abc".matches(re1));
System.out.println("abcd".matches(re1));
String re2 = "a\\&c"; // 对应的正则是a\&c
System.out.println("a&c".matches(re2));
System.out.println("a-c".matches(re2));
System.out.println("a&&c".matches(re2));
}
}
2.1 匹配非 ASCII 字符
例如中文,那就用\u####
的十六进制表示,例如:a\u548cc
匹配字符串"a和c"
,中文字符和
的Unicode 编码是 548c
。
2.2 匹配任意字符
精确匹配实际上作用不大,因为我们可以直接用String.equals()
就可以做到,大多数情况下,我们想要的匹配规则更多的是模糊匹配。我们可以用.
匹配一个任意字符。例如,正则表达式a.c
中间的.
可以匹配一个任意字符,例如,下面的字符串可以被匹配:
- abc
- a&b
- acc
但它不能匹配 ac、a&&c,因为 .
匹配一个字符且仅限一个字符。
2.3 匹配数字
如果我们只想匹配0
~9
这样的数字,可以用\d
匹配。例如,正则表达式00\d
可以匹配:
- 007
- 008
它不能匹配 00A,0077,因为\d
仅限单个数字字符。
2.4 匹配常用字符
用\w
可以匹配一个字母、数字或下划线,w 的意思是 word。例如,java\w
可以匹配:
- javac
- java9
- java_
它不能匹配 java#,"java ",因为\w
不能匹配 #、空格等字符。
2.5 匹配空格字符
用\s
可以匹配一个空格字符,注意空格字符不但包括" ",还包括 tab 字符(在 Java 中用 \t
表示)。例如,a\sc
可以匹配:
- “a c”
- “a c”
它不能匹配 ac, abc 等。
2.6 匹配非数字
用\d
可以匹配一个数字,而\D
则匹配一个非数字。例如,00\D
可以匹配:
- 00A
- 00#
00\d
可以匹配的字符串 “007”, “008” 等,00\D
是不能匹配的。
类似的,\W
可以匹配\s
不能匹配的字