正则表达式

正则表达式(Regular Expression, regex) 是一种用于匹配字符串的强大工具,广泛应用于文本查找、替换和验证操作中。它通过特定的模式来描述要匹配的文本。

1. 正则表达式的基本组成部分

字符类

  • [abc]:匹配 abc 中的任意一个字符。
  • [^abc]:匹配除 abc 之外的任何字符(取反)。
  • [a-z]:匹配所有小写字母。
  • [A-Z]:匹配所有大写字母。
  • [0-9]:匹配所有数字。
  • .(点号):匹配除换行符以外的任意单个字符。

元字符

  • \d:匹配任意数字,等价于 [0-9]
  • \D:匹配非数字字符,等价于 [^0-9]
  • \w:匹配字母、数字、下划线,等价于 [a-zA-Z0-9_]
  • \W:匹配非字母、数字、下划线,等价于 [^a-zA-Z0-9_]
  • \s:匹配任何空白字符(包括空格、制表符、换行符)。
  • \S:匹配任何非空白字符。

量词(指定匹配次数)

  • *:匹配前面的字符 0 次或多次,例如 a* 匹配 0 个或多个 a
  • +:匹配前面的字符 1 次或多次,例如 a+ 匹配 1 个或多个 a
  • ?:匹配前面的字符 0 次或 1 次,例如 a? 匹配 0 个或 1 个 a
  • {n}:匹配前面的字符恰好 n 次,例如 a{3} 匹配 3 个 a
  • {n,}:匹配前面的字符至少 n 次,例如 a{2,} 匹配 2 个或更多 a
  • {n,m}:匹配前面的字符至少 n 次,至多 m 次,例如 a{2,4} 匹配 2 到 4 个 a

边界匹配符

  • ^:匹配字符串的开头。例如,^a 匹配以 a 开头的字符串。
  • $:匹配字符串的结尾。例如,a$ 匹配以 a 结尾的字符串。
  • \b:匹配单词边界。例如,\bword\b 只匹配独立的 word
  • \B:匹配非单词边界。例如,\Bword\B 匹配不在边界上的 word

分组与引用

  • (abc):将 abc 作为一个组。例如 (abc)+ 匹配一个或多个 abc
  • \1\2 等:引用前面括号中的匹配结果。例如,(a)(b)\1\2 匹配 abab

或运算

  • a|b:匹配 ab。例如,apple|orange 匹配 appleorange

2. 常用正则表达式示例

匹配一个有效的电子邮件地址

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • ^[a-zA-Z0-9._%+-]+:以字母、数字、点、下划线、百分号、加号、减号等字符开头,并匹配一个或多个这些字符。
  • @[a-zA-Z0-9.-]+:匹配 @ 后的域名部分。
  • \.[a-zA-Z]{2,}$:匹配一个点后跟 2 个或更多的字母。

匹配电话号码(如:123-456-7890)

^\d{3}-\d{3}-\d{4}$
  • \d{3}:匹配三个数字。
  • -:匹配连字符。
  • \d{4}:匹配四个数字。

匹配 IP 地址

^([0-9]{1,3}\.){3}[0-9]{1,3}$
  • ([0-9]{1,3}\.){3}:匹配三段 1 到 3 个数字,后面跟一个点。
  • [0-9]{1,3}:匹配最后一段 1 到 3 个数字。

匹配 URL

^(https?|ftp)://[^\s/$.?#].[^\s]*$
  • https?|ftp:匹配 httphttpsftp
  • [^\s/$.?#]:匹配非空白字符或 /.$?# 等。
  • [^\s]*$:匹配路径部分,直到结束。

3. Java 中的正则表达式使用

在 Java 中,正则表达式常用于 String 类的 replaceAll()matches()split() 方法,或 PatternMatcher 类。

例1:使用 replaceAll 去除非字母字符

String text = "Hello, World!";
String result = text.replaceAll("[^a-zA-Z]", "");
System.out.println(result);  // 输出:HelloWorld

例2:验证电子邮件地址

String email = "example@test.com";
boolean isValid = email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
System.out.println(isValid);  // 输出:true

例3:使用 split() 分割字符串

String sentence = "This is a test.";
String[] words = sentence.split("\\s+");  // 按空格分割
for (String word : words) {
    System.out.println(word);
}

总结:

正则表达式是一个强大的文本处理工具,能够根据模式灵活匹配字符串。通过理解字符类、元字符、量词、分组和边界等,可以处理各种复杂的字符串匹配需求。

posted @ 2024-09-10 01:36  admin_tai  阅读(19)  评论(0编辑  收藏  举报