正则表达式
正则表达式(Regular Expression, regex) 是一种用于匹配字符串的强大工具,广泛应用于文本查找、替换和验证操作中。它通过特定的模式来描述要匹配的文本。
1. 正则表达式的基本组成部分
字符类
[abc]
:匹配a
、b
或c
中的任意一个字符。[^abc]
:匹配除a
、b
、c
之外的任何字符(取反)。[a-z]
:匹配所有小写字母。[A-Z]
:匹配所有大写字母。[0-9]
:匹配所有数字。.
(点号):匹配除换行符以外的任意单个字符。
元字符
\d
:匹配任意数字,等价于[0-9]
。\D
:匹配非数字字符,等价于[^0-9]
。\w
:匹配字母、数字、下划线,等价于[a-zA-Z0-9_]
。\W
:匹配非字母、数字、下划线,等价于[^a-zA-Z0-9_]
。\s
:匹配任何空白字符(包括空格、制表符、换行符)。\S
:匹配任何非空白字符。
量词(指定匹配次数)
*
:匹配前面的字符 0 次或多次,例如a*
匹配 0 个或多个a
。+
:匹配前面的字符 1 次或多次,例如a+
匹配 1 个或多个a
。?
:匹配前面的字符 0 次或 1 次,例如a?
匹配 0 个或 1 个a
。{n}
:匹配前面的字符恰好 n 次,例如a{3}
匹配 3 个a
。{n,}
:匹配前面的字符至少 n 次,例如a{2,}
匹配 2 个或更多a
。{n,m}
:匹配前面的字符至少 n 次,至多 m 次,例如a{2,4}
匹配 2 到 4 个a
。
边界匹配符
^
:匹配字符串的开头。例如,^a
匹配以a
开头的字符串。$
:匹配字符串的结尾。例如,a$
匹配以a
结尾的字符串。\b
:匹配单词边界。例如,\bword\b
只匹配独立的word
。\B
:匹配非单词边界。例如,\Bword\B
匹配不在边界上的word
。
分组与引用
(abc)
:将abc
作为一个组。例如(abc)+
匹配一个或多个abc
。\1
、\2
等:引用前面括号中的匹配结果。例如,(a)(b)\1\2
匹配abab
。
或运算
a|b
:匹配a
或b
。例如,apple|orange
匹配apple
或orange
。
2. 常用正则表达式示例
匹配一个有效的电子邮件地址
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
^[a-zA-Z0-9._%+-]+
:以字母、数字、点、下划线、百分号、加号、减号等字符开头,并匹配一个或多个这些字符。@[a-zA-Z0-9.-]+
:匹配 @ 后的域名部分。\.[a-zA-Z]{2,}$
:匹配一个点后跟 2 个或更多的字母。
匹配电话号码(如:123-456-7890)
^\d{3}-\d{3}-\d{4}$
\d{3}
:匹配三个数字。-
:匹配连字符。\d{4}
:匹配四个数字。
匹配 IP 地址
^([0-9]{1,3}\.){3}[0-9]{1,3}$
([0-9]{1,3}\.){3}
:匹配三段 1 到 3 个数字,后面跟一个点。[0-9]{1,3}
:匹配最后一段 1 到 3 个数字。
匹配 URL
^(https?|ftp)://[^\s/$.?#].[^\s]*$
https?|ftp
:匹配http
、https
或ftp
。[^\s/$.?#]
:匹配非空白字符或/
、.
、$
、?
、#
等。[^\s]*$
:匹配路径部分,直到结束。
3. Java 中的正则表达式使用
在 Java 中,正则表达式常用于 String
类的 replaceAll()
、matches()
、split()
方法,或 Pattern
和 Matcher
类。
例1:使用 replaceAll
去除非字母字符
String text = "Hello, World!";
String result = text.replaceAll("[^a-zA-Z]", "");
System.out.println(result); // 输出:HelloWorld
例2:验证电子邮件地址
String email = "example@test.com";
boolean isValid = email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
System.out.println(isValid); // 输出:true
例3:使用 split()
分割字符串
String sentence = "This is a test.";
String[] words = sentence.split("\\s+"); // 按空格分割
for (String word : words) {
System.out.println(word);
}
总结:
正则表达式是一个强大的文本处理工具,能够根据模式灵活匹配字符串。通过理解字符类、元字符、量词、分组和边界等,可以处理各种复杂的字符串匹配需求。