java正则表达式如何获取xml文件中指定节点的值

 更新时间:2023年06月17日 16:42:07   作者:FinelyYang  
这篇文章主要介绍了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() 返回当前到了哪个位置
        }
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解spring如何使用注解开发

    详解spring如何使用注解开发

    今天给大家整理了spring如何使用注解开发这篇文章,文中有非常详细的介绍及代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • 关于SpringGateway调用服务 接受不到参数问题

    关于SpringGateway调用服务 接受不到参数问题

    这篇文章主要介绍了关于SpringGateway调用服务接受不到参数问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • springboot-jpa的实现操作

    springboot-jpa的实现操作

    这篇文章主要介绍了springboot-jpa的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • maven repository详解

    maven repository详解

    这篇文章主要介绍了maven repository的相关知识,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Java单例模式的几种常见写法

    Java单例模式的几种常见写法

    这篇文章主要介绍了Java单例模式的几种写法,单例模式是面试中的常客了,常见写法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举,接下来我们一起进入文章看看吧
    2022-05-05
  • SpringBoot开发详解之Controller接收参数及参数校验

    SpringBoot开发详解之Controller接收参数及参数校验

    数据校验是为了使系统更完整,数据更精确,同时也有利于维护数据的安全性,下面这篇文章主要给大家介绍了关于SpringBoot开发详解之Controller接收参数及参数校验的相关资料,需要的朋友可以参考下
    2022-03-03
  • java list随机抽取元素的案例

    java list随机抽取元素的案例

    这篇文章主要介绍了java list随机抽取元素的案例,具有很好的参考,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 关于SpringBoot改动后0.03秒启动的问题

    关于SpringBoot改动后0.03秒启动的问题

    这篇文章主要介绍了SpringBoot改动后0.03秒启动,本文结合示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • java实现识别二维码图片功能

    java实现识别二维码图片功能

    这篇文章主要为大家详细介绍了java实现识别二维码图片功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • java 排序算法之归并排序

    java 排序算法之归并排序

    本文主要讲解了排序算法中的归并排序,文中运用大量的图片和代码讲解的非常详细,感兴趣的朋友可以学习一下这篇文章,相信可以帮助到你
    2021-09-09

最新评论