Java 中使用正则表达式
1. 引入包
在使用正则表达式之前,需要引入包:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
2. 常用模式规则
-
元字符 :这些是正则表达式中的特殊字符,用于匹配特定的模式。
-
.
:匹配任意单个字符(换行符除外)。例如,a.b
可以匹配 "acb"、"aab" 等,但不能匹配 "ab" 或 "a\nb"。 -
^
:匹配字符串的开头。比如,^abc
表示以 "abc" 开头的字符串,如 "abcdef"。 -
$
:匹配字符串的结尾。例如,abc$
表示以 "abc" 结尾的字符串,如 "xyzabc"。 -
|
:表示逻辑 “或”。如a|b
可以匹配 "a" 或者 "b"。 -
*
:匹配前一个字符或子表达式零次或多次。例如,ab*
可以匹配 "a"、"ab"、"abb" 等。 -
+
:匹配前一个字符或子表达式一次或多次。比如,ab+
可以匹配 "ab"、"abb",但不能匹配 "a"。 -
?
:匹配前一个字符或子表达式零次或一次。例如,ab?
可以匹配 "a" 和 "ab"。 -
[]
:匹配括号内的任意一个字符。例如,[abc]
可以匹配 "a"、"b"、"c" 中的任意一个字符。 -
[^ ]
:匹配不在括号内的任意一个字符。比如,[^abc]
可以匹配除 "a"、"b"、"c" 之外的任意一个字符。 -
-
:在字符类中表示范围。例如,[a-z]
表示匹配任意一个小写字母。 -
\d
:匹配任意一个数字,等价于[0-9]
。 -
\D
:匹配任意一个非数字,等价于[^0-9]
。 -
\s
:匹配任意一个空白字符,包括空格、制表符、换页符等。 -
\S
:匹配任意一个非空白字符。 -
\w
:匹配任意一个字母、数字或下划线,等价于[A-Za-z0-9_]
。 -
\W
:匹配任意一个非字母、数字或下划线。
-
-
量词 :用于指定某个部分出现的次数或范围。
-
{n}
:表示前面的字符或子表达式恰好出现 n 次。例如,a{3}
表示 "aaa"。 -
{n,}
:表示前面的字符或子表达式至少出现 n 次。比如,a{2,}
表示至少出现两个 "a",如 "aa"、"aaa" 等。 -
{n,m}
:表示前面的字符或子表达式出现次数在 n 到 m 之间。例如,a{1,3}
表示出现 1 - 3 次的 "a"。
-
3. 使用步骤
-
创建 Pattern 对象 :通过
Pattern.compile()
方法编译一个正则表达式为模式对象。例如:Pattern pattern = Pattern.compile("a.b");
这一步是对正则表达式进行预编译,提高匹配效率。
-
创建 Matcher 对象 :调用 Pattern 对象的
matcher()
方法,传入要匹配的字符串,得到 Matcher 对象。例如:Matcher matcher = pattern.matcher("acb");
Matcher 对象用于对字符串进行匹配操作。
-
执行匹配操作 :使用 Matcher 类提供的方法进行匹配操作,常见的方法有:
-
matches()
:尝试将整个字符串与模式匹配。如果整个字符串都符合模式,则返回 true,否则返回 false。例如:boolean result = matcher.matches(); // 判断整个字符串是否符合模式
* `lookingAt()` :尝试将从字符串的开头开始与模式进行匹配。如果从开头开始匹配成功,则返回 true,否则返回 false。例如:
boolean result = matcher.lookingAt(); // 判断字符串开头是否符合模式
* `find()` :扫描字符串,查找与模式匹配的下一个子序列。如果找到,则返回 true,否则返回 false。每次调用 find() 方法会从上次匹配结束的位置继续查找。例如:
while (matcher.find()) {System.out.println(matcher.group()); // 打印所有匹配的子序列 }
* `group()` :返回当前匹配的整个字符串或分组捕获的子串。如果调用 `group()` 无参数,返回整个匹配的字符串;如果传入分组索引,返回对应分组捕获的子串。例如:
String wholeMatch = matcher.group(); // 获取整个匹配的字符串 String group1 = matcher.group(1); // 获取第一个分组捕获的子串(如果有)
4. 应用场景举例
场景一:验证邮箱格式
public class EmailValidation {public static void main(String[] args) {String regex = "^[A-Za-z0-9\\._%+-]+@[A-Za-z0-9\\.-]+\\.[A-Za-z]{2,6}$";Pattern pattern = Pattern.compile(regex);String email1 = "example@example.com";String email2 = "invalid-email";Matcher matcher1 = pattern.matcher(email1);Matcher matcher2 = pattern.matcher(email2);System.out.println("Email1 is valid: " + matcher1.matches()); // 输出 trueSystem.out.println("Email2 is valid: " + matcher2.matches()); // 输出 false} }
在这个例子中,正则表达式用于验证字符串是否符合常见的邮箱格式。
场景二:提取电话号码
public class PhoneNumberExtractor {public static void main(String[] args) {String regex = "\\d{3}-\\d{3}-\\d{4}";Pattern pattern = Pattern.compile(regex);String text = "Contact us at 123-456-7890 or 987-654-3210.";Matcher matcher = pattern.matcher(text);while (matcher.find()) {System.out.println("Found phone number: " + matcher.group());}// 输出:Found phone number: 123-456-7890, Found phone number: 987-654-3210} }
通过正则表达式从文本中提取符合特定格式的电话号码。
场景三:替换字符串中的部分内容
public class StringReplacer {public static void main(String[] args) {String text = "Hello, world! Welcome to the world of Java.";String regex = "world";String replacement = "universe";String newText = text.replaceAll(regex, replacement);System.out.println(newText); // 输出:Hello, universe! Welcome to the universe of Java.} }
使用
replaceAll()
方法将字符串中所有匹配正则表达式的内容替换为指定字符串。
-