正则表达式

正则表达式在搜索,替换,检查和解析字符串方面有着高效且简洁的优点

基本概念和用法

  1. 普通字符

普通字符就是普通字符,例如,正则表达式abc会匹配包含“abc”的字符串

  1. 特殊字符(元字符)
  • .(点):匹配任意单个字符(除了换行符)。
  • ^(脱字符号):匹配输入字符串的开始位置。
  • $(美元符号):匹配输入字符串的结束位置。
  • [](方括号):匹配方括号内的任意字符(字符集)。
  • |(竖线):匹配两项之间的任意一项(或)。
  • \(反斜杠):转义特殊字符或表示特殊序列。
  1. 字符类
  • [abc]:匹配任何一个字符a、b或c。
  • [^abc]:匹配除了a、b、c之外的任何字符。
  • [a-z]:匹配任何一个小写字母。
  • [A-Z]:匹配任何一个大写字母。
  • [0-9]:匹配任何一个数字。
  1. 预定义字符类
  • \d:匹配任何一个数字(等同于 [0-9])。
  • \D:匹配任何非数字字符(等同于 [^0-9])。
  • \w:匹配任何字母数字字符(等同于 [a-zA-Z0-9_])。
  • \W:匹配任何非字母数字字符(等同于 [^a-zA-Z0-9_])。
  • \s:匹配任何空白字符(空格、制表符、换行符等)。
  • \S:匹配任何非空白字符。
  1. 量词
  • *:零次或多次。
  • +:一次或多次。
  • ?:零次或一次。
  • {n}:确定的n次。
  • {n,}:至少n次。
  • {n,m}:最少n次且最多m次。
  1. 分组和捕获
  • (...):将多个表达式组合成一个子表达式,并捕获匹配的文本。

注意事项:

​ 默认情况下,量词是贪婪的,它们会尽可能多地匹配字符。要使量词非贪婪(即尽可能少地匹配字符),可以在量词后面加上一个问号,例如 *?+?{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 对象中查找下一个匹配项。
    • 示例:使用 PatternMatcher 来查找和替换文本中的特定模式。
  • Matcher.group()
    • 返回由 Matcher 对象的最后一次匹配操作所匹配的输入子序列。

后三个方法的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
}
}
}