1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【Java】正则表达式的使用以及解析XML

【Java】正则表达式的使用以及解析XML

时间:2019-11-02 09:46:28

相关推荐

【Java】正则表达式的使用以及解析XML

目录

正则部分定义举例 Java正则部分单子字符串提取数据多子字符串提取数据

在日常使用正则表达式的时候,常常就是直接百度匹配这个字符串的正则表达式。正则表达式的规则还是比较多的,一段时间不用就容易忘了。这里就不得不提及两个非常通用的匹配方法贪婪匹配惰性匹配,在做爬虫或者提取字符串中的数据时,基本使用这两个都能搞定。

正则部分

定义

贪婪匹配:.*

惰性匹配:.*?

.*具有贪婪模式匹配到不能匹配为止

.*?则相反匹配到匹配到一个后,就继续往下匹配不会回溯,具有最小匹配原则性质。

举例

直接上栗子

网上的正则测试也挺多的,这边附上一个链接 在线正则表达式测试

如字符串:{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 {@Testpublic void t1(){String xml = "<areas><area>璃月</area></areas>";Pattern compile = pile("<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)则是我们定义的匿名分组。

既然有匿名分组,自然有命名分组代码如下

@Testpublic void t2(){String xml = "<areas><area>璃月</area></areas>";Pattern compile = pile("<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>

匹配这个字符串与上面的相同,正则表达式都不需要改变但提取的时候,需要进行循环提取。代码如下

@Testpublic void t3(){String xml = "<areas><area>蒙德</area><area>璃月</area><area>稻妻</area><area>须弥</area></areas>";Pattern compile = pile("<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() 返回当前到了哪个位置}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。