分组
【摘要】 分组常用的分组构造形式(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)