Java正则多次匹配和多次组匹配
关于正则表达式 , 可以学习下这篇介绍 : 正则表达式
对于多次匹配, 正则表达式就需要讲究些技巧了.
替换#
单文的多次匹配#
有以下几种方式 , 把a
全匹配替换
替换 a#
"aab".replaceAll("a{1}", "x"); //xxb
"aba".replaceAll("a{1}", "x"); //xbx
替换 aa#
"abaaabaaaba".replaceAll("a{2}", "x"); //abxabxaba
"abaabaaaaba".replaceAll("a{2}", "x"); //abxbxxba
replaceAll()
方法会将所有匹配到的全部替换掉.
提取#
提取就需要用到group
了.
提取 a#
Matcher matcher = Pattern.compile("(a)").matcher("ab");
if(matcher.find()){
System.out.println(matcher.group());
}
--------
// 结果
a
提取多个 a#
group
只有提取一次匹配到的 , 要多次提取 , 需要循环匹配.
Matcher matcher = Pattern.compile("(a)").matcher("aba");
int matcher_start = 0;
while (matcher.find(matcher_start)){
System.out.println(matcher.group(1));
matcher_start = matcher.end();
}
------------
// 结果
a
a
提取复杂内容#
示例在一个文本中提取多个xml标签
String txt = "abc123<root>这是root1</root><root>这是root2</root>";
Matcher matcher = Pattern.compile("<root>(.*?)</root>").matcher(txt);
int matcher_start = 0;
while (matcher.find(matcher_start)){
System.out.println(matcher.group(1));
matcher_start = matcher.end();
}
------
// 结果
这是root1
这是root2
group使用的注意点#
多匹配和少匹配#
上面的复杂示例中, 正则是 <root>(.*?)</root>
, 中间的分组匹配是 (.*?)
,里面是有个问号?
的 .
正则默认是多匹配的, 尽可能多的匹配到文本.
-
多匹配
那么不加
?
时, 只能匹配到一个文本 ,<root>(.*)</root>
匹配到的是:这是root1</root><root>这是root2
, 会把中间的全部匹配进去了. 这就是多匹配 -
少匹配
要尽可能少的匹配 , 就需要加上
?
,<root>(.*?)</root>
匹配到的是:这是root1
. 这个结果一般才是想要的.
group 匹配的组的顺序#
matcher.group(1) // 这里是group序号1
group
匹配后得到是一个数组 , 数组0位置是全匹配文本 , 数组1位置才是第一个匹配到的分组.
例如:
上面的示例中, <root>(.*?)</root>
得到的group(0)
是 <root>这是root1</root>
.
序号不好识别的话, 可以用别名来识别 .
String txt = "abc123<root>这是root1</root><root>这是root2</root>";
Matcher matcher = Pattern.compile("<root>(?<element>.*?)</root>").matcher(txt);
int matcher_start = 0;
while (matcher.find(matcher_start)){
System.out.println(matcher.group("element"));
matcher_start = matcher.end();
}
------
// 结果
这是root1
这是root2
element
就是文本的别称 , 可以直接用别称提取内容.
如果文章有帮助到您,请点个赞,您的反馈会让我感到文章是有价值的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗