正则表达式(Regular Expression),简称正则,是一种用于匹配字符串中字符组合的模式。它广泛应用于字符串查找、替换、数据验证等任务中。在Java中,正则表达式的支持由
java.util.regex
包提供。本文将详细介绍正则表达式的基础知识、用法和示例,帮助你全面理解和应用正则表达式。
正则表达式简介
正则表达式是一种字符序列,它定义了一个搜索模式。主要用于字符串模式匹配,如检索、替换、验证字符串。
基本结构
- 字面字符:直接匹配字符本身,如
a
、1
、A
。 - 元字符:具有特殊意义的字符,如
.
、*
、+
、?
、[]
、()
等。
常见元字符
.
:匹配任意单个字符(不包括换行符)。*
:匹配前面的子表达式零次或多次。+
:匹配前面的子表达式一次或多次。?
:匹配前面的子表达式零次或一次。[]
:匹配括号内的任意字符。()
:分组符,用于将多个字符作为一个单独的单元进行处理。\
:转义字符,用于转义元字符。
正则表达式用法
在Java中,正则表达式主要通过Pattern
和Matcher
类来使用。
1. Pattern
类
用于编译正则表达式。常用方法:
Pattern.compile(String regex)
: 编译给定的正则表达式。
2. Matcher
类
用于匹配正则表达式。常用方法:
Matcher.matches()
: 尝试将整个输入序列与模式匹配。Matcher.find()
: 尝试在输入序列中查找与模式匹配的子序列。Matcher.group()
: 返回由以前匹配操作所匹配的输入子序列。
示例代码
以下是一些常见的正则表达式使用示例。
示例1:基本匹配
java
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String input = "hello123";
//w+:匹配一个或多个单词字符(字母、数字或下划线)。
//d+:匹配一个或多个数字。
String pattern = "\\w+\\d+";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(input);
if (matcher.matches()) {
System.out.println("The input matches the pattern.");
} else {
System.out.println("The input does not match the pattern.");
}
}
}
/*
输出 The input matches the pattern.
*/
示例2:分割字符串
当调用str.split("\\s+")
时,split
方法会寻找一个或多个连续的空白字符,并以这些空白字符作为分隔符进行分割。
java
public class SplitExample {
public static void main(String[] args) {
String str = "Java is fun";
// 使用一个或多个空白字符作为分隔符
// \\s:匹配任何空白字符,包括空格、制表符、换行符等。
// +:匹配前面的子表达式一次或多次。
String[] words = str.split("\\s+");
// 打印分割后的字符串数组
for (String word : words) {
System.out.println(word);
}
}
}
/*
Java
is
fun
*/
常见正则表达式符号及其解释
字符类
[abc]
:匹配a
、b
或c
中的任意一个字符。[^abc]
:匹配除a
、b
、c
之外的任意字符。[a-zA-Z]
:匹配任意大小写字母。[0-9]
:匹配任意数字。[a-z]
:匹配任意小写字母。[A-Z]
:匹配任意大写字母。[a-zA-Z0-9]
:匹配任意字母和数字。[!@#\$%\^&*()]
:匹配任意一个特殊字符。预定义字符类
.
:匹配任意字符(除换行符)。\d
:匹配任意数字,等价于[0-9]
。\D
:匹配任意非数字,等价于[^0-9]
。\w
:匹配任意单词字符(字母、数字、下划线),等价于[a-zA-Z0-9_]
。\W
:匹配任意非单词字符,等价于[^a-zA-Z0-9_]
。\s
:匹配任意空白字符(空格、制表符、换行符)。\S
:匹配任意非空白字符。数量词
*
:匹配前面的子表达式零次或多次。+
:匹配前面的子表达式一次或多次。?
:匹配前面的子表达式零次或一次。{n}
:匹配前面的子表达式恰好n次。{n,}
:匹配前面的子表达式至少n次。{n,m}
:匹配前面的子表达式至少n次,至多m次。
示例3:验证电子邮件地址
java
import java.util.regex.*;
public class EmailValidation {
public static void main(String[] args) {
String email = "example@example.com";
String pattern = "^[\\w-\\.]+@[\\w-\\.]+\\.[a-zA-Z]{2,}$";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(email);
if (matcher.matches()) {
System.out.println("Valid email address.");
} else {
System.out.println("Invalid email address.");
}
}
}
java
String pattern = "^[\\w-\\.]+@[\\w-\\.]+\\.[a-zA-Z]{2,}$";
正则表达式模式解释
^:表示字符串的开始。
[\\w-\\.]+:匹配一个或多个单词字符(字母、数字、下划线)、连字符或点号。
@:匹配字符 @。
[\\w-\\.]+:匹配一个或多个单词字符(字母、数字、下划线)、连字符或点号。
\\.:匹配字符 .,需要转义。
[a-zA-Z]{2,}:匹配两个或更多的字母字符。
$:表示字符串的结束。
综上,这个正则表达式匹配的模式是 用户名@域名.顶级域名,其中:
用户名可以包含字母、数字、下划线、连字符和点号。
域名可以包含字母、数字、下划线、连字符和点号。
顶级域名必须是两个或更多的字母。
示例4:提取数字
java
import java.util.regex.*;
public class ExtractNumbers {
public static void main(String[] args) {
String input = "Order1234 shipped on 2023-01-01";
String pattern = "\\d+";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(input);
while (matcher.find()) {
System.out.println("Found number: " + matcher.group());
}
}
}
/* 输出结果
Found number: 1234
Found number: 2023
Found number: 01
Found number: 01
*/
总结
正则表达式是一个强大且灵活的字符串处理工具,通过本文的介绍和示例,相信你已经掌握了正则表达式的基本知识和常见应用。在实际开发中,合理运用正则表达式,可以大大提高字符串处理的效率和代码的可读性。
希望本文对你有所帮助。如果你有任何疑问或建议,欢迎在评论区留言讨论。Happy coding!