title: 正则表达式
date: 2024-11-28 21:11:26
tags: [正则表达式,java]
正则表达式
正则表达式在搜索,替换,检查和解析字符串方面有着高效且简洁的优点
基本概念和用法
- 普通字符
普通字符就是普通字符,例如,正则表达式abc会匹配包含“abc”的字符串
- 特殊字符(元字符)
.(点):匹配任意单个字符(除了换行符)。^(脱字符号):匹配输入字符串的开始位置。$(美元符号):匹配输入字符串的结束位置。[](方括号):匹配方括号内的任意字符(字符集)。|(竖线):匹配两项之间的任意一项(或)。- ``(反斜杠):转义特殊字符或表示特殊序列。
- 字符类
[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:匹配任何非空白字符。
- 量词
*:零次或多次。+:一次或多次。?:零次或一次。{n}:确定的n次。{n,}:至少n次。{n,m}:最少n次且最多m次。
- 分组和捕获
(...):将多个表达式组合成一个子表达式,并捕获匹配的文本。
注意事项:
默认情况下,量词是贪婪的,它们会尽可能多地匹配字符。要使量词非贪婪(即尽可能少地匹配字符),可以在量词后面加上一个问号,例如 *?、+? 或 {n,}?。
使用示例
- 查找字符串中的所有数字:
\d+ - 查找字符串中的所有单词:
\w+ - 查找字符串中的所有电子邮件地址:
\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z|a-z]{2,}\b - 查找字符串中的所有URL:
(https?://\S+)
具体实现
-
String.replaceAll(String regex, String replacement)- 替换所有匹配的子串。
- 示例:
"Hello World!".replaceAll("[aeiou]", "*")会返回"H*ll* W*rld!"。
-
String.replaceFirst(String regex, String replacement)- 只替换第一次匹配的子串。
- 示例:
"Hello World!".replaceFirst("[aeiou]", "*")会返回"H*llo World!"。
-
String.matches(String regex)- 检查整个字符串是否匹配正则表达式。
- 示例:
"123".matches("\d\d\d")返回true。
-
String.find(String regex)- 查找字符串中第一次出现的正则表达式匹配项。
- 示例:
"Hello World".find("[aeiou]")返回第一个匹配的字符"e"。
-
String.split(String regex)- 根据正则表达式分割字符串。
- 示例:
"one,two,three".split(",")返回数组["one", "two", "three"]。
-
String.contains(String regex)- 检查字符串是否包含正则表达式匹配的子串。
- 示例:
"Hello World".contains("[aeiou]")返回true。
-
Pattern.compile(String regex)- 编译正则表达式,返回一个
Pattern对象。 - 示例:
Pattern.compile("\d\d\d")编译一个匹配三个数字的正则表达式。
- 编译正则表达式,返回一个
-
Matcher.find()- 在
Matcher对象中查找下一个匹配项。 - 示例:使用
Pattern和Matcher来查找和替换文本中的特定模式。
- 在
-
Matcher.group()- 返回由
Matcher对象的最后一次匹配操作所匹配的输入子序列。
- 返回由
后三个方法的例子:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexExample {
public static void main(String[] args) {
// 定义要匹配的字符串
String text = "Hello World, 123 and 456";
// 编译正则表达式,匹配一个或多个数字
Pattern pattern = Pattern.compile("\d+");
// 创建 Matcher 对象
Matcher matcher = pattern.matcher(text);
// 循环查找所有匹配项
while (matcher.find()) {
// 获取匹配的子序列
String matchedGroup = matcher.group();
System.out.println("Found: " + matchedGroup);
}
}
}