Java进阶之正则表达式
今天来看一下正则表达式,什么是正则表达式呢?
正则表达式(Regular Expression,简称RegEx)是一种用于匹配字符串中字符组合的模式。可以帮助我们对文本字符串进行搜索、替换、分割和校验等操作。
正则表达式并不是Java所独有的特性,而是一种强大且灵活的工具,任何语言都可以结合它来实现功能。最早是由Perl语言中发展来的。
为什么是对字符串来进行操作呢?因为String是一种很强大的类型,支持任何类型的转换,用字符串都可以表示这些类型。
正则表达式由普通字符(例如字母和数字)以及特殊字符(称为元字符)组成,这些元字符具有特殊的含义,用于指定模式匹配的规则。
普通字符就不说了,元字符有以下分类:
元字符
.:匹配除换行符之外的任意单个字符。
[]:匹配方括号内的任意一个字符(字符类)。
[^]:匹配不在方括号内的任意一个字符(否定字符类)。
\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次。
定位符
^:匹配输入字符串的开始位置。
$:匹配输入字符串的结束位置。
分组和引用
(exp):匹配exp并捕获文本到自动命名的组里。
(?:exp):匹配exp但不捕获匹配的文本。
\n:引用编号为n的捕获组匹配的文本。
选择符
|:匹配两个或多个分支选择的任意一个。
Java中提供了java.util.regex包下的类来支持正则表达式的使用。主要类和方法:
Pattern类:它是正则表达式编译后的表示形式。通过调用Pattern.compile(String regex)方法,可以将正则表达式编译成Pattern对象。
Matcher类:它用于对输入字符串进行正则表达式的匹配操作。可以通过Pattern对象的matcher(CharSequence input)方法获得Matcher对象。
PatternSyntaxException:当正则表达式语法不正确时,会抛出这个异常。
示例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
// 编译正则表达式
Pattern pattern = Pattern.compile("\\d+");
// 要匹配的字符串
String text = "电话号码是1316651,不是55125。";
// 创建matcher对象
Matcher matcher = pattern.matcher(text);
// 查找匹配的字符串
while (matcher.find()) {
System.out.println("找到的电话号码: " + matcher.group());
}
}
}
通过上面可以看到\\d代表数字,+代表一次或者多次
简单匹配了一下,并且输出了匹配到的字符。
我们也可以进行校验,比如校验手机号邮箱的格式:
// 手机号的正则表达式,这里假设手机号是11位数字,且以1开头
Pattern pattern = Pattern.compile("^1[3-9]\\d{9}$");
Matcher matcher = pattern.matcher("13800008888");
System.out.println("验证结果: " + matcher.matches());
Pattern和Matcher类中提供了很多的API来支持正则表达式。
这里就不深究了,需要的时候直接让AI帮你写一个就行了。
值得一提的是Java的String类提供的API很好的支持了正则表达式:
public boolean matches(String regex):这个方法用于检查字符串是否与给定的正则表达式匹配。如果匹配,返回true;否则返回false。
public String[] split(String regex):这个方法根据匹配给定的正则表达式来拆分字符串,并返回一个字符串数组。
public String replaceAll(String regex, String replacement):这个方法将字符串中所有匹配给定的正则表达式的子串替换为指定的字符串。
public String replaceFirst(String regex, String replacement):这个方法将字符串中第一个匹配给定的正则表达式的子串替换为指定的字符串。
public String[] split(String regex, int limit):这个方法与split(String regex)类似,但增加了limit参数来限制拆分后的子字符串数组的长度。
示例:
public class RegexStringMethodsExample {
public static void main(String[] args) {
String text = "Hello 123 World 456!";
// 使用 matches 方法检查字符串是否匹配正则表达式
boolean isMatch = text.matches(".*\\d+.*");
System.out.println("Matches digits: " + isMatch);
// 使用 split 方法根据正则表达式拆分字符串
String[] splitText = text.split("\\s+");
for (String str : splitText) {
System.out.println(str);
}
// 使用 replaceAll 方法替换所有匹配的子串
String replacedText = text.replaceAll("\\d+", "numbers");
System.out.println("Text after replacing numbers: " + replacedText);
// 使用 replaceFirst 方法替换第一个匹配的子串
String firstReplacedText = text.replaceFirst("\\d+", "number");
System.out.println("Text after replacing first number: " + firstReplacedText);
// 使用 split 方法并限制结果数组的长度
String[] limitedSplitText = text.split("\\s+", 3);
for (String str : limitedSplitText) {
System.out.println(str);
}
}
}
正则表达式,可以极大地简化文本处理任务,提高开发效率。
END