本文从正则表达式的基本概念,匹配规则,复杂匹配,分组匹配,非贪婪匹配及具体应用方面进行介绍。
正则表达式简介
- 正则表达式可以用字符串来描述规则,并用来匹配字符串。
- 在其他语言中,
\\
表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。 在 Java 中,\\
表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。 所以,在其他的语言中(如Perl),一个反斜杠 \就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个\\
代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是\\d
,而表示一个普通的反斜杠是\\\\
。
public class RegexDemo {
public static void main(String[] args) {
// \d表示任意一个数字
String regex = "20\\d\\d";
System.out.println("2019".matches(regex)); // true
System.out.println("2100".matches(regex)); //false
}
//判断手机号是否为11位
public static boolean isValidMobileNumber(String s) {
return s.matches("\\d{11}");
}
}
匹配规则
- 精准匹配
对于正则表达式abc
来说,它只能精确地匹配字符串"abc"
,不能匹配"ab"
,"Abc"
,"abcd"
等其他任何字符串。
- 匹配任意字符
精确匹配实际上用处不大,因为我们直接用String.equals()
就可以做到。大多数情况下,我们想要的匹配规则更多的是模糊匹配。我们可以用.
匹配一个任意字符。
- 匹配数字
如果我们只想匹配0
~9
这样的数字,可以用\d
匹配,仅限单个数字字符。例如,正则表达式00\d
可以匹配:
- 匹配常用字符
用\w
可以匹配一个字母、数字或下划线,w的意思是word。
- 匹配空格字符
用\s
可以匹配一个空格字符,注意空格字符不但包括空格,还包括tab字符(在Java中用\t
表示)。
- 匹配非数字
用\d
可以匹配一个数字,而\D
则匹配一个非数字。
类似的,\W
可以匹配\w
不能匹配的字符,\S
可以匹配\s
不能匹配的字符,这几个正好是反着来的。
- 重复匹配
- 修饰符
*
可以匹配任意个字符,包括0个字符 - 修饰符
+
可以匹配至少一个字符 - 修饰符
?
可以匹配0个或一个字符 - 修饰符
{n}
可以精确指定n个字符 - 修饰符
{n,m}
可以指定匹配n~m个字符 - 修饰符
{n,}
就可以匹配至少n个字符
public static void main(String[] args) {
//精准匹配
System.out.println("精准匹配:");
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)); //true
System.out.println("a-c".matches(re2));
System.out.println("a&&c".matches(re2));
//匹配任意字符
System.out.println("匹配任意字符:");
String re3 = "a.c";
System.out.println("abc".matches(re3)); //true
System.out.println("a&c".matches(re3)); //true
System.out.println("ac".matches(re3)); //false
System.out.println("abcc".matches(re3)); //false
//匹配数字
System.out.println("匹配数字:");
String re4 = "00\\d";
System.out.println("005".matches(re4));//true
System.out.println("00A".matches(re4));//false
System.out.println("0088".matches