java正则表达式如何获取xml文件中指定节点的值
正则表达式获取xml文件中指定节点的值
/** * 获取指定标签中的内容 * * @param xml 传入的xml字符串 * @param label 指定的标签 */ public static List<String> getFieldListByRegex(String xml, String label) { //正则表达式 String regex = "<" + label + ">(.*?)</" + label + ">"; Pattern pattern = Pattern.compile(regex); Matcher m = pattern.matcher(xml); //匹配的有多个 List<String> fieldList = new ArrayList<>(); while (m.find()) { if (StringUtils.isNotEmpty(m.group(1).trim())) { fieldList.add(m.group(1).trim()); } } return fieldList; }
正则表达式的使用以及解析XML
在日常使用正则表达式的时候,常常就是直接百度匹配这个字符串的正则表达式。正则表达式的规则还是比较多的,一段时间不用就容易忘了。
这里就不得不提及两个非常通用的匹配方法 贪婪匹配和 惰性匹配,在做爬虫或者提取字符串中的数据时,基本使用这两个都能搞定。
正则部分
定义
- 贪婪匹配:
.*
- 惰性匹配:
.*?
表达式 | 含义 |
---|---|
. | 是任意字符 可以匹配任何单个字符。 |
* | 匹配0个或多个正好在它之前的那个字符。 |
? | 匹配0个或1个正好在它之前的那个字符。 |
.* | 匹配0个或多个任意字符 |
.? | 匹配0个或1个任意字符 |
.*
具有贪婪模式匹配到不能匹配为止.*?
则相反匹配到匹配到一个后,就继续往下匹配不会回溯,具有最小匹配原则性质。
举例
直接上栗子
网上的正则测试也挺多的
如字符串:{123}}}}
- 使用
{.*}
匹配的结果是{123}}}}
- 使用
{.*?}
匹配的结果是{123}
这个应该就能很明显看出贪婪与惰性匹配的区别所在了。
在爬虫中,我们常常使用.*
去匹配我们不需要的字符串,使用.*?
来匹配我们需要提取的。
Java正则部分
正则表达式的匹配是不区分编程语言的,但是在语言的使用中也会有一些疑问如:
已经匹配上子字符串了如何提取自己想要的内容?
匹配到了多个子字符串,如何获取到所有匹配到的子字符串中的数据?
find()和matches()的区别是什么?
直接上代码
单子字符串提取数据
现在有这么个需要匹配的字符串,该如何将所有人的名字都提取出来呢
<areas><area>璃月</area></areas>
import org.junit.jupiter.api.Test; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ReTest { @Test public void t1(){ String xml = "<areas><area>璃月</area></areas>"; Pattern compile = Pattern.compile("<area>(.*?)</area>"); Matcher m = compile.matcher(xml); if (m.find()){ System.out.println(m.group(0)); System.out.println(m.group(1)); } } }
<area>璃月</area> 璃月
<area>(.*?)</area>
中的()
是给我们的匹配到的子字符串定义分组,group(0)
是匹配到的字符串的全部,而group(1)
则是我们定义的匿名分组。
既然有匿名分组,自然有命名分组代码如下
@Test public void t2(){ String xml = "<areas><area>璃月</area></areas>"; Pattern compile = Pattern.compile("<area>(?<area>.*?)</area>"); Matcher m = compile.matcher(xml); if (m.find()){ System.out.println(m.group(0)); System.out.println("匿名分组:"+m.group(1)); System.out.println("命名分组:"+m.group("area")); } }
<area>璃月</area> 匿名分组:璃月 命名分组:璃月
代码中还有一个方法m.find(),该方法如果找到满足条件的正则表达式就会返回ture。也可以传入一个int,如
m.find(5)表示从字符串的第5位开始匹配。
其实还有一个方法也是匹配字符串m.matches():该方法是整个原始字符串满足正则才返回true,因此该方法适合于匹配字符串是否满足某个格式时使用,如手机号,身份证,邮箱等。
多子字符串提取数据
如下字符串,如何将所有的area都提取出来?
<areas><area>蒙德</area><area>璃月</area><area>稻妻</area><area>须弥</area></areas>
匹配这个字符串与上面的相同,正则表达式都不需要改变但提取的时候,需要进行循环提取。
代码如下
@Test public void t3(){ String xml = "<areas><area>蒙德</area><area>璃月</area><area>稻妻</area><area>须弥</area></areas>"; Pattern compile = Pattern.compile("<area>(?<area>.*?)</area>"); Matcher m = compile.matcher(xml); int start = 0; while (m.find(start)){ System.out.println(m.group(1)); start = m.end(); // m.end() 返回当前到了哪个位置 } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot开发详解之Controller接收参数及参数校验
数据校验是为了使系统更完整,数据更精确,同时也有利于维护数据的安全性,下面这篇文章主要给大家介绍了关于SpringBoot开发详解之Controller接收参数及参数校验的相关资料,需要的朋友可以参考下2022-03-03
最新评论