java正則表達(dá)式如何獲取xml文件中指定節(jié)點(diǎn)的值
正則表達(dá)式獲取xml文件中指定節(jié)點(diǎn)的值
/** * 獲取指定標(biāo)簽中的內(nèi)容 * * @param xml 傳入的xml字符串 * @param label 指定的標(biāo)簽 */ public static List<String> getFieldListByRegex(String xml, String label) { //正則表達(dá)式 String regex = "<" + label + ">(.*?)</" + label + ">"; Pattern pattern = Pattern.compile(regex); Matcher m = pattern.matcher(xml); //匹配的有多個(gè) List<String> fieldList = new ArrayList<>(); while (m.find()) { if (StringUtils.isNotEmpty(m.group(1).trim())) { fieldList.add(m.group(1).trim()); } } return fieldList; }
正則表達(dá)式的使用以及解析XML
在日常使用正則表達(dá)式的時(shí)候,常常就是直接百度匹配這個(gè)字符串的正則表達(dá)式。正則表達(dá)式的規(guī)則還是比較多的,一段時(shí)間不用就容易忘了。
這里就不得不提及兩個(gè)非常通用的匹配方法 貪婪匹配和 惰性匹配,在做爬蟲(chóng)或者提取字符串中的數(shù)據(jù)時(shí),基本使用這兩個(gè)都能搞定。
正則部分
定義
- 貪婪匹配:
.*
- 惰性匹配:
.*?
表達(dá)式 | 含義 |
---|---|
. | 是任意字符 可以匹配任何單個(gè)字符。 |
* | 匹配0個(gè)或多個(gè)正好在它之前的那個(gè)字符。 |
? | 匹配0個(gè)或1個(gè)正好在它之前的那個(gè)字符。 |
.* | 匹配0個(gè)或多個(gè)任意字符 |
.? | 匹配0個(gè)或1個(gè)任意字符 |
.*
具有貪婪模式匹配到不能匹配為止.*?
則相反匹配到匹配到一個(gè)后,就繼續(xù)往下匹配不會(huì)回溯,具有最小匹配原則性質(zhì)。
舉例
直接上栗子
網(wǎng)上的正則測(cè)試也挺多的
如字符串:{123}}}}
- 使用
{.*}
匹配的結(jié)果是{123}}}}
- 使用
{.*?}
匹配的結(jié)果是{123}
這個(gè)應(yīng)該就能很明顯看出貪婪與惰性匹配的區(qū)別所在了。
在爬蟲(chóng)中,我們常常使用.*
去匹配我們不需要的字符串,使用.*?
來(lái)匹配我們需要提取的。
Java正則部分
正則表達(dá)式的匹配是不區(qū)分編程語(yǔ)言的,但是在語(yǔ)言的使用中也會(huì)有一些疑問(wèn)如:
已經(jīng)匹配上子字符串了如何提取自己想要的內(nèi)容?
匹配到了多個(gè)子字符串,如何獲取到所有匹配到的子字符串中的數(shù)據(jù)?
find()和matches()的區(qū)別是什么?
直接上代碼
單子字符串提取數(shù)據(jù)
現(xiàn)在有這么個(gè)需要匹配的字符串,該如何將所有人的名字都提取出來(lái)呢
<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> 匿名分組:璃月 命名分組:璃月
代碼中還有一個(gè)方法m.find(),該方法如果找到滿足條件的正則表達(dá)式就會(huì)返回ture。也可以傳入一個(gè)int,如
m.find(5)表示從字符串的第5位開(kāi)始匹配。
其實(shí)還有一個(gè)方法也是匹配字符串m.matches():該方法是整個(gè)原始字符串滿足正則才返回true,因此該方法適合于匹配字符串是否滿足某個(gè)格式時(shí)使用,如手機(jī)號(hào),身份證,郵箱等。
多子字符串提取數(shù)據(jù)
如下字符串,如何將所有的area都提取出來(lái)?
<areas><area>蒙德</area><area>璃月</area><area>稻妻</area><area>須彌</area></areas>
匹配這個(gè)字符串與上面的相同,正則表達(dá)式都不需要改變但提取的時(shí)候,需要進(jìn)行循環(huán)提取。
代碼如下
@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() 返回當(dāng)前到了哪個(gè)位置 } }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在mybatis中使用mapper進(jìn)行if條件判斷
這篇文章主要介紹了在mybatis中使用mapper進(jìn)行if條件判斷,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Java8新日期時(shí)間API的20個(gè)使用示例
這篇文章主要介紹了Java8新日期時(shí)間API的20個(gè)使用示例,為了學(xué)習(xí)Java 8的這個(gè)新庫(kù),這里我創(chuàng)建了20個(gè)以任務(wù)為導(dǎo)向的例子,需要的朋友可以參考下2015-03-03Java構(gòu)造方法實(shí)例詳解(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)
其實(shí)java構(gòu)造方法很簡(jiǎn)單,下面通過(guò)示例給大家分享java構(gòu)造方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-04-04JavaAPI中BigInteger、BigDecimal的使用方法及應(yīng)用
這篇文章主要給大家介紹了關(guān)于JavaAPI中BigInteger、BigDecimal的使用方法及應(yīng)用,BigInteger是Java中用于表示任意大小整數(shù)的類,它提供了加、減、乘、除等多種運(yùn)算方法,適用于大整數(shù)處理和高精度計(jì)算場(chǎng)景,需要的朋友可以參考下2024-11-11SpringMVC響應(yīng)視圖和結(jié)果視圖詳解
這篇文章主要介紹了SpringMVC響應(yīng)視圖和結(jié)果視圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java之Scanner.nextLine()讀取回車的問(wèn)題及解決
這篇文章主要介紹了Java之Scanner.nextLine()讀取回車的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04解讀Spring配置與服務(wù)組件的關(guān)系和注入機(jī)制
這篇文章主要介紹了解讀Spring配置與服務(wù)組件的關(guān)系和注入機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09