分组

举报
周小末天天开心 发表于 2022/12/31 22:39:23 2022/12/31
【摘要】 分组常用的分组构造形式(1)(pattern) 说明:非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其他捕获结果则是根据左括号的顺序从1开始自动编号。(2)(?pattern) 说明:命名捕获。将匹配的子字符串捕获到一个组名称或者编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号代替尖括号,例如(?'name')(...

分组

常用的分组构造形式

(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));
        }
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。