java正则表达式
Java中的正则表达式用于字符串的模式匹配,功能强大且灵活。Java通过java.util.regex包支持正则表达式,主要用到Pattern和Matcher两个类。以下是一些Java正则表达式的基本用法和示例:
基本用法
-
导入包:
import java.util.regex.Pattern; import java.util.regex.Matcher; -
创建Pattern对象:
使用Pattern.compile(String regex)方法编译正则表达式,返回一个Pattern对象。Pattern pattern = Pattern.compile("\\d+"); // 匹配一个或多个数字 -
创建Matcher对象:
使用Pattern对象的matcher(CharSequence input)方法,创建一个Matcher对象。Matcher matcher = pattern.matcher("123abc456"); -
进行匹配:
使用Matcher对象的方法如find()、matches()、start()、end()等进行匹配操作。while (matcher.find()) { System.out.println("Found a match: " + matcher.group()); }
常用方法
-
find():尝试查找与该模式匹配的输入序列的下一个子序列。 -
matches():尝试将整个区域与模式匹配。 -
group():返回与上一个匹配操作匹配的输入子序列。 -
start()和end():返回上一个匹配操作匹配的子序列的起始和结束索引。
示例代码
以下是一个简单的示例,展示如何使用正则表达式在Java中查找字符串中的所有数字:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexExample {
public static void main(String[] args) {
String input = "There are 123 apples and 456 oranges.";
String regex = "\\d+"; // 匹配一个或多个数字
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Found a number: " + matcher.group() + " at position " + matcher.start() + " to " + matcher.end());
}
}
}
正则表达式语法
-
.:匹配除换行符以外的任意单个字符。 -
\\d:匹配一个数字,相当于[0-9]。 -
\\D:匹配一个非数字字符。 -
\\s:匹配一个空白字符,包括空格、制表符、换页符等。 -
\\S:匹配一个非空白字符。 -
\\w:匹配一个字母、数字或下划线,相当于[a-zA-Z_0-9]。 -
\\W:匹配一个非字母、数字或下划线的字符。 -
*:匹配前面的子表达式零次或多次。 -
+:匹配前面的子表达式一次或多次。 -
?:匹配前面的子表达式零次或一次。 -
{n}:匹配前面的子表达式恰好n次。 -
{n,}:匹配前面的子表达式至少n次。 -
{n,m}:匹配前面的子表达式至少n次,至多m次。 -
^:匹配输入字符串的开始位置。 -
$:匹配输入字符串的结束位置。 -
|:表示或操作。
正则表达式是一个非常强大的工具,可以极大地简化字符串处理任务。在Java中,通过java.util.regex包提供的类和方法,可以方便地应用正则表达式进行各种复杂的字符串匹配和操作。
在Java正则表达式中,特殊字符(也称为元字符)用于定义匹配模式和规则。以下是一些常见的特殊字符及其含义:
1. 字符匹配相关
-
.- 匹配除换行符以外的任意单个字符。
- 示例:
a.c可以匹配 "abc"、"acc" 等。
-
\\d- 匹配一个数字,相当于
[0-9]。 - 示例:
\\d+可以匹配 "123"、"456" 等。
- 匹配一个数字,相当于
-
\\D- 匹配一个非数字字符。
- 示例:
\\D+可以匹配 "abc"、"!@#" 等。
-
\\s- 匹配一个空白字符,包括空格、制表符、换页符等。
- 示例:
\\s+可以匹配一个或多个空白字符。
-
\\S- 匹配一个非空白字符。
- 示例:
\\S+可以匹配 "abc"、"123" 等。
-
\\w- 匹配一个字母、数字或下划线,相当于
[a-zA-Z_0-9]。 - 示例:
\\w+可以匹配 "abc123"、"_underscore" 等。
- 匹配一个字母、数字或下划线,相当于
-
\\W- 匹配一个非字母、数字或下划线的字符。
- 示例:
\\W+可以匹配 "!@#"、"$$$" 等。
2. 数量词相关
-
*- 匹配前面的子表达式零次或多次。
- 示例:
ab*可以匹配 "a"、"ab"、"abb" 等。
-
+- 匹配前面的子表达式一次或多次。
- 示例:
ab+可以匹配 "ab"、"abb",但不能匹配 "a"。
-
?- 匹配前面的子表达式零次或一次。
- 示例:
ab?可以匹配 "a"、"ab"。
-
{n}- 匹配前面的子表达式恰好
n次。 - 示例:
a{3}可以匹配 "aaa"。
- 匹配前面的子表达式恰好
-
{n,}- 匹配前面的子表达式至少
n次。 - 示例:
a{2,}可以匹配 "aa"、"aaa" 等。
- 匹配前面的子表达式至少
-
{n,m}- 匹配前面的子表达式至少
n次,至多m次。 - 示例:
a{2,3}可以匹配 "aa"、"aaa"。
- 匹配前面的子表达式至少
3. 位置相关
-
^- 匹配输入字符串的开始位置。
- 示例:
^abc可以匹配以 "abc" 开头的字符串。
-
$- 匹配输入字符串的结束位置。
- 示例:
abc$可以匹配以 "abc" 结尾的字符串。
-
\\b- 匹配一个单词边界,即单词字符和非单词字符之间的位置。
- 示例:
\\bword\\b可以匹配独立的单词 "word"。
-
\\B- 匹配非单词边界。
- 示例:
\\Bword\\B可以匹配 "sword" 中的 "word",但不能匹配独立的 "word"。
4. 分组和选择相关
-
()- 标记一个子表达式的开始和结束位置,可用于分组。
- 示例:
(ab)+可以匹配 "ab"、"abab" 等。
-
|- 表示或关系,匹配左边或右边的子表达式。
- 示例:
a|b可以匹配 "a" 或 "b"。
-
[ ]- 字符集,匹配方括号中的任意字符。
- 示例:
[abc]可以匹配 "a"、"b" 或 "c"。
-
[^ ]- 负字符集,匹配不在方括号中的任意字符。
- 示例:
[^abc]可以匹配除 "a"、"b"、"c" 以外的任意字符。
5. 转义字符
-
\\- 转义字符,用于匹配特殊字符本身或引入特殊序列。
- 示例:
\\.可以匹配字面上的点号 "."。
示例代码
以下是一个简单的示例,展示如何使用这些特殊字符:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexSpecialCharacters {
public static void main(String[] args) {
String input = "Hello 123 World! 456";
String regex = "\\d+"; // 匹配一个或多个数字
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Found a number: " + matcher.group());
}
}
}
在这个示例中,\\d+ 用于匹配字符串中的一个或多个数字。
Java正则表达式中的特殊字符提供了强大的模式匹配能力。通过组合使用这些特殊字符,可以构建出复杂的正则表达式,用于各种字符串处理任务。在使用时,需要注意转义字符的使用,以确保正则表达式能够正确解析。
以下是几个常用的Java正则表达式示例,涵盖不同的应用场景:
1. 验证电子邮件地址
正则表达式:
String regex = "^[\\w._%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}$";
说明:
^和$分别匹配字符串的开始和结束。[\\w._%+-]+匹配邮箱用户名部分,允许字母、数字、下划线、点、百分号、加号和减号。@[\\w.-]+匹配域名部分,允许字母、数字、点和减号。\\.[a-zA-Z]{2,}匹配顶级域名,至少两个字母。
示例代码:
String email = "example@test.com";
boolean isValid = email.matches("^[\\w._%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}$");
System.out.println("Is valid email: " + isValid);
2. 验证手机号码(中国大陆)
正则表达式:
String regex = "1[3-9]\\d{9}";
说明:
1表示手机号以1开头。[3-9]表示第二位是3到9之间的数字。\\d{9}表示后面跟着9个数字。
示例代码:
String phoneNumber = "13812345678";
boolean isValid = phoneNumber.matches("1[3-9]\\d{9}");
System.out.println("Is valid phone number: " + isValid);
3. 验证IPv4地址
正则表达式:
String regex = "^(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)){3}$";
说明:
25[0-5]匹配250到255之间的数字。2[0-4]\\d匹配200到249之间的数字。1\\d{2}匹配100到199之间的数字。[1-9]?\\d匹配0到99之间的数字。(\\....){3}确保有四个部分,每部分用点分隔。
示例代码:
String ipAddress = "192.168.1.1";
boolean isValid = ipAddress.matches("^(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)){3}$");
System.out.println("Is valid IP address: " + isValid);
4. 验证日期格式(YYYY-MM-DD)
正则表达式:
String regex = "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$";
说明:
\\d{4}匹配四位年份。(0[1-9]|1[0-2])匹配月份,01到12。(0[1-9]|[12]\\d|3[01])匹配日期,01到31。
示例代码:
String date = "2023-10-05";
boolean isValid = date.matches("^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$");
System.out.println("Is valid date: " + isValid);
5. 匹配URL
正则表达式:
String regex = "^(https?|ftp)://[\\w.-]+(:\\d+)?(/[\\w./?%&=-]*)?$";
说明:
(https?|ftp)匹配协议,http、https或ftp。://匹配协议和主机名之间的分隔符。[\\w.-]+匹配主机名。(:\\d+)?匹配可选的端口号。(/[\\w./?%&=-]*)?匹配可选的路径。
示例代码:
String url = "https://www.example.com";
boolean isValid = url.matches("^(https?|ftp)://[\\w.-]+(:\\d+)?(/[\\w./?%&=-]*)?$");
System.out.println("Is valid URL: " + isValid);
6. 验证密码强度(至少8个字符,包含字母和数字)
正则表达式:
String regex = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$";
说明:
(?=.*[A-Za-z])确保至少包含一个字母。(?=.*\\d)确保至少包含一个数字。[A-Za-z\\d]{8,}确保总长度至少为8个字符。
示例代码:
String password = "Password123";
boolean isValid = password.matches("^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$");
System.out.println("Is strong password: " + isValid);
7. 匹配纯数字字符串
正则表达式:
String regex = "^\\d+$";
说明:
^和$分别匹配字符串的开始和结束。\\d+匹配一个或多个数字。
示例代码:
String number = "123456";
boolean isValid = number.matches("^\\d+$");
System.out.println("Is numeric string: " + isValid);
8. 匹配空白字符
正则表达式:
String regex = "\\s+";
说明:
\\s+匹配一个或多个空白字符,包括空格、制表符、换页符等。
示例代码:
String text = "Hello World!";
Pattern pattern = Pattern.compile("\\s+");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Found whitespace at position: " + matcher.start() + " to " + matcher.end());
}

总结
这些示例展示了Java正则表达式在不同场景下的应用,包括验证输入格式、匹配特定模式等。正则表达式是一种强大的工具,但也可能变得复杂,因此在设计时应尽量保持简洁和清晰。根据具体需求,可以调整正则表达式的复杂度,以满足不同的匹配要求。
更多推荐




所有评论(0)