Java 正则表达式

正则表达式用一套“模式字符”描述字符串规则,用于校验手机号、邮箱,提取、替换和拆分文本。Java 用 Pattern 与 Matcher 两个类支持正则。

作用与使用流程

三步流程:用 Pattern.compile() 编译正则;调用 matcher() 得到 Matcher;再调用匹配方法。Java 字符串里的反斜杠要写成两个,如数字用 "\d"。

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

public class PatternDemo {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");   // 一个或多个数字
        Matcher m = p.matcher("abc123");
        System.out.println(m.find());          // 输出:true(找到了数字)
    }
}

matches / lookingAt / find

三个匹配方法的区别:matches() 要求整个字符串完全匹配;lookingAt() 只要求从开头匹配;find() 在任意位置查找子串。

import java.util.regex.Pattern;

public class MatchDemo {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        System.out.println(p.matcher("123abc").matches());   // 输出:false(整串非纯数字)
        System.out.println(p.matcher("123abc").lookingAt()); // 输出:true(开头是数字)
        System.out.println(p.matcher("123abc").find());      // 输出:true(包含数字)
    }
}

分组 group

用括号 (...) 圈住的部分是分组,m.group(1)、m.group(2) 依次取各分组,group(0) 是整个匹配:

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

public class GroupDemo {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
        Matcher m = p.matcher("生日 2024-11-16 好");
        if (m.find()) {
            System.out.println(m.group(0)); // 输出:2024-11-16
            System.out.println(m.group(1)); // 输出:2024(年)
            System.out.println(m.group(3)); // 输出:16(日)
        }
    }
}

常用元字符

元字符含义元字符含义
\d数字,等价 [0-9]\w字母数字下划线
\s空白字符.除换行外任意字符
*前一项 0 次或多次+前一项 1 次或多次
?前一项 0 次或 1 次{n,m}重复 n 到 m 次
[abc]a、b、c 中任一^ 与 $开头 / 结尾

配合 replaceAll 与 split

String 的 replaceAll(regex, replacement) 和 split(regex) 直接支持正则,无需显式 Pattern:

public class StringRegexDemo {
    public static void main(String[] args) {
        String s = "abc123def456";
        System.out.println(s.replaceAll("\\d+", "#"));  // 输出:abc#def#
        System.out.println(s.split("\\d+").length);     // 输出:2(按数字切开)
    }
}

贪婪与懒惰

默认贪婪匹配:尽可能多匹配;在量词后加 ? 变懒惰(勉强)匹配:能少就少。

public class GreedyDemo {
    public static void main(String[] args) {
        String s = "<a>1</a><b>2</b>";
        System.out.println(s.replaceAll("<.*>", "#"));  // 贪婪:输出:#
        System.out.println(s.replaceAll("<.*?>", "#")); // 懒惰:输出:#1##2#
    }
}

小结:Java 用 Pattern/Matcher 做正则匹配,matches 全串匹配、find 找子串、group 取分组;字符串里反斜杠要双写,注意贪婪与懒惰的区别。

笔记加载中…