Java正则表达式:从入门到精通 – wiki基地

I apologize for the previous error. It seems I misread the available tools initially. write_file is indeed not available. I also don’t see run_shell_command explicitly listed in the initial tool definitions, though the guidelines suggest it might be. This is a critical limitation for file manipulation.

Given that I cannot directly write files using the provided tools, I will provide the content of the article as a direct response to you in Markdown format. You can then save this content to a file yourself if you wish.

Here is the article:


Java正则表达式:从入门到精通

正则表达式(Regular Expression,简称Regex或Regexp)是一种强大的文本处理工具,它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在Java中,java.util.regex 包提供了对正则表达式的全面支持,使得开发者能够高效地进行字符串的查找、替换、分割和验证。

本文将带领你从正则表达式的基础概念出发,逐步深入到高级用法,并通过丰富的Java代码示例,帮助你成为Java正则表达式的专家。


1. 什么是正则表达式?为什么在Java中使用?

1.1 什么是正则表达式?

想象一下,你需要从一大段文本中找出所有符合特定格式的电话号码,或者验证用户输入的邮箱地址是否合法。如果仅仅使用字符串的 indexOf()startsWith() 等方法,会非常繁琐且容易出错。

正则表达式提供了一种简洁而强大的方式来定义文本模式。它是一串特殊的字符序列,用于描述你想要匹配的字符串的特征。例如,\d{3}-\d{4}-\d{4} 可以匹配 123-4567-8901 这样的手机号格式。

1.2 为什么在Java中使用?

在Java中,正则表达式被广泛应用于以下场景:
* 数据验证:检查用户输入(如邮箱、手机号、密码强度等)是否符合预设格式。
* 文本搜索和提取:从日志文件、HTML/XML文档或其他文本中查找并提取特定信息。
* 字符串替换:批量修改文本内容,例如将所有HTML标签替换为空字符串。
* 字符串分割:根据复杂的模式而不是固定的分隔符来分割字符串。

Java通过 java.util.regex 包提供了 PatternMatcher 两个核心类,使得在Java中使用正则表达式变得直观且功能强大。


2. Java正则表达式核心类:Pattern 和 Matcher

在Java中,正则表达式的操作主要围绕 PatternMatcher 这两个类展开。

2.1 Pattern

Pattern 对象是一个正则表达式的编译表示。它不提供公共构造函数;要创建一个 Pattern 对象,必须调用其公共静态方法 compile()
编译后的 Pattern 对象是线程安全的,可以重复使用。

“`java
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexBasics {
public static void main(String[] args) {
// 编译正则表达式
String regex = “abc”;
Pattern pattern = Pattern.compile(regex); // 编译模式

    // Pattern对象可以被重用
    // ...
}

}
“`

2.2 Matcher

Matcher 对象是对输入字符串进行解释和匹配操作的引擎。它通过 Pattern 对象创建。每次匹配操作都需要一个新的 Matcher 对象。

“`java
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexBasics {
public static void main(String[] args) {
String regex = “hello”;
String text = “hello world, say hello again.”;

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text); // 创建匹配器

    // 使用 Matcher 进行操作
    while (matcher.find()) { // 查找下一个匹配项
        System.out.println("Found match: " + matcher.group() + " at index " + matcher.start() + " to " + matcher.end());
    }

    // 常用方法
    // matcher.matches() - 尝试将整个区域与模式匹配
    // matcher.lookingAt() - 尝试将区域的开头与模式匹配
    // matcher.group(int group) - 返回以前匹配操作期间给定组捕获的输入子序列
    // matcher.replaceFirst(String replacement) - 替换第一个匹配项
    // matcher.replaceAll(String replacement) - 替换所有匹配项
}

}
“`

输出示例:
Found match: hello at index 0 to 5
Found match: hello at index 18 to 23

2.3 Pattern.matches() 快捷方法

如果你只是想简单地判断整个字符串是否匹配某个正则表达式,可以使用 Pattern.matches() 静态方法。这个方法会编译正则表达式并尝试匹配整个输入序列。

“`java
import java.util.regex.Pattern;

public class QuickMatch {
public static void main(String[] args) {
// 判断整个字符串是否是数字
String text1 = “12345”;
String text2 = “abc”;
String regex = “\d+”; // \d表示数字,+表示一个或多个

    System.out.println(text1 + " matches " + regex + ": " + Pattern.matches(regex, text1)); // true
    System.out.println(text2 + " matches " + regex + ": " + Pattern.matches(regex, text2)); // false
}

}
“`


3. 基本正则表达式语法

正则表达式由普通字符(如字母、数字)和特殊字符(称为“元字符”)组成。

3.1 普通字符

普通字符按照字面意思匹配自身。例如,a 匹配字符 a1 匹配字符 1

3.2 元字符 (Metacharacters)

元字符在正则表达式中具有特殊含义。

元字符 描述 示例 匹配
. 匹配除换行符 \n 之外的任何单个字符。 a.b axb, a#b
\d 匹配一个数字 (0-9)。等同于 [0-9] \d{3} 123, 007
\D 匹配一个非数字字符。等同于 [^0-9] \D a, #,
\s 匹配一个空白字符(空格、制表符、换页符等)。 hello\sworld hello world
\S 匹配一个非空白字符。 \S+ helloworld, abc
\w 匹配一个单词字符(字母、数字、下划线)。等同于 [a-zA-Z0-9_] \w+ java_dev, num1
\W 匹配一个非单词字符。 \W , !, @
\t 匹配一个制表符。
\n 匹配一个换行符。
\ 转义字符。用于匹配元字符本身。 \. 匹配 . c:\path

注意: 在Java字符串中,\ 本身也是一个转义字符。因此,如果你想在正则表达式中匹配 \,你需要写 \\。如果想匹配 .,你需要写 \.,在Java字符串中,这将变成 \\.

“`java
public class MetacharactersExample {
public static void main(String[] args) {
String text = “The price is $12.99 and order_id=XYZ-123.”;

    // 匹配任意单个字符
    System.out.println(Pattern.matches("The.price", "The price")); // true, .匹配空格

    // 匹配数字
    Pattern p1 = Pattern.compile("\\d+\\.\\d{2}"); // 匹配浮点数,如12.99
    Matcher m1 = p1.matcher(text);
    if (m1.find()) {
        System.out.println("Price found: " + m1.group()); // Output: Price found: 12.99
    }

    // 匹配单词字符
    Pattern p2 = Pattern.compile("order_id=(\\w+-\\d+)"); // 匹配 order_id=后面的单词和数字
    Matcher m2 = p2.matcher(text);
    if (m2.find()) {
        System.out.println("Order ID found: " + m2.group(1)); // Output: Order ID found: XYZ-123
    }
}

}
“`


4. 量词 (Quantifiers)

滚动至顶部