分组

113 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情

分组

常用的分组构造形式

(1)(pattern) 说明:非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其他捕获结果则是根据左括号的顺序从1开始自动编号。

(2)(?pattern) 说明:命名捕获。将匹配的子字符串捕获到一个组名称或者编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号代替尖括号,例如(?'name')

(3)(?:pattern) 说明:匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符('|')组合模式部件的情况很有用。例如'industr(?:y|ies)是比'industry|industries'更经济的表达式。

(4)(?=pattern) 说明:它是一个非捕获匹配。例如'Windows(?=95|98NT|2000)'匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。

(5)(?!pattern) 说明:该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。它是一个非捕获匹配。例如'Windows(?!95|98NT|2000)'匹配"Windows 3.1"中的"Windows",但不匹配"Windows 2000"中的"Windows"。

分组案例

import java.util.regex.Matcher;
import java.util.regex.Pattern;
    
public class RegExp07 {
    public static void main(String[] args) {
        String content = "hanshunping s7789 nn1189han";
        //下面就是非命名分组
        //说明
        // 1. matcher.group(0) 得到匹配到的字符串
        // 2. matcher.group(1) 得到匹配到的字符串的第 1 个分组内容
        // 3. matcher.group(2) 得到匹配到的字符串的第 2 个分组内容
        //String regStr = "(\\d\\d)(\\d\\d)";//匹配 4 个数字的字符串
    
        //命名分组: 即可以给分组取名
        String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";//匹配 4 个数字的字符串
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
    
        while (matcher.find()) {
            System.out.println("找到=" + matcher.group(0));
            System.out.println("第 1 个分组内容=" + matcher.group(1));
            System.out.println("第 1 个分组内容[通过组名]=" + matcher.group("g1"));
            System.out.println("第 2 个分组内容=" + matcher.group(2));
            System.out.println("第 2 个分组内容[通过组名]=" + matcher.group("g2"));
        }
    }
}

演示非捕获分组

import java.util.regex.Matcher;
import java.util.regex.Pattern;
    
public class RegExp08 {
    public static void main(String[] args) {
        String content = "hello 周小末老师 jack 周小末同学 周小末小孩 hello 周小末学生";
        // 找到 周小末老师 、周小末同学、周小末小孩 子字符串
        //String regStr = "周小末老师|周小末同学|周小末小孩";
        //上面的写法可以等价非捕获分组, 注意:不能 matcher.group(1)
        //String regStr = "周小末(?:老师|同学|小孩)";
        //找到 周小末 这个关键字,但是要求只是查找周小末老师和 周小末同学 中包含有的周小末
        //下面也是非捕获分组,不能使用 matcher.group(1)
        //String regStr = "周小末(?=老师|同学)";
        //找到 周小末 这个关键字,但是要求只是查找 不是 (周小末老师 和 周小末同学) 中包含有的周小末
        //下面也是非捕获分组,不能使用 matcher.group(1)
        String regStr = "周小末(?!老师|同学)";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) {
            System.out.println("找到: " + matcher.group(0));
        }
    }
}