Java正則表達(dá)式匹配不到結(jié)果的解決
如下所示:
String str = "\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?><Response xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Header ShouldRecordPerformanceTime=\"false\" Timestamp=\"2018-6-25 21:24:03\" RequestID=\"2c4d0b24-fd48-4a92-a2d8-c66793df2059\" ResultCode=\"Success\" AssemblyVersion=\"2.9.5.0\" RequestBodySize=\"0\" SerializeMode=\"Xml\" RouteStep=\"1\" Environment=\"pro\" /><SSPATResponse><Result>0</Result><FareDetail /><Price>0</Price><ErrCode>102</ErrCode><DetailInfo>Send:APPLOCK\n" +
"Rev:\n" +
"可用資源鎖定成功, 60 秒內(nèi)沒有輸入指令資源將被Buk收回\n" +
"Send:IG\n" +
"Rev:\n" +
"NO PNR\n" +
"Send:\n" +
"SS:AA186/N/27JUN18/PEKORD/NN1;\n" +
"Rev:\n" +
"AA 186 N 27JUN PEKORD NN1 WL OPEN \n" +
"UNABLE TO SELL.PLEASE CHECK THE AVAILABILITY WITH \"AV\" AGAIN\n" +
"Send:IG\n" +
"Rev:</DetailInfo><PatOfficeno>SHA717</PatOfficeno></SSPATResponse><ResponseStatus><Timestamp xmlns=\"http://soa.ctrip.com/common/types/v1\">2018-06-25T21:24:03.4535624+08:00</Timestamp><Ack xmlns=\"http://soa.ctrip.com/common/types/v1\">Success</Ack></ResponseStatus></Response>";
String regex = "<DetailInfo>((.|\\n")*?)</DetailInfo>";
str為要匹配的字符串(是傳入的),regex為正則表達(dá)式
目的是匹配出<DetailInfo>標(biāo)簽中的內(nèi)容
在本地測試時(shí)可以匹配出來,但是在線上就不行。
真的是百思不得其解……
后來認(rèn)真比對了一下線上傳入的str和本地復(fù)制過來的str,發(fā)現(xiàn)了了一個(gè)微小的不同
線上傳入的str行分隔符是\r\n,而復(fù)制粘貼到本地之后都變成了\n
而我的正則表達(dá)式中只匹配了\n的情況,因此出現(xiàn)這樣的bug
提醒自己要注意系統(tǒng)之間的差別,win上的行分隔符是\n,而Linux是\r\n
為了能適配所有的環(huán)境,可以直接用System.lineSeparator()來替代,當(dāng)然也可以把表達(dá)式寫成這樣(
<DetailInfo>((.|\\n|\\r\\n")*?)</DetailInfo>
補(bǔ)充:Java正則表達(dá)式匹配的坑
今天在判斷字符串是否存在某個(gè)字符串,直接用String.matches(regex),死活匹配不出來,在線正則工具用了很多都是可以的,后面找到問題,總結(jié)一下,防止再次踩坑。
一、前提#
java中判斷一段字符串中是否包含某個(gè)字符串的方式:
1、#
String.matches(regex);
閱讀源碼發(fā)現(xiàn),這個(gè)方法本質(zhì)是調(diào)用了Pattern.matches(regex, str),而該方法調(diào)Pattern.compile(regex).matcher(input).matches()方法,而Matcher.matches()方法試圖將整個(gè)區(qū)域與模式匹配,如果匹配成功,則可以通過開始、結(jié)束和組方法獲得更多信息。
即這個(gè)方法會在表達(dá)式前后加上$(regex$),是對這個(gè)字符串全匹配
而不會只匹配其中的子串,如果只想匹配子串,則需要表達(dá)式匹配整段
2、#
Pattern.compile(regex).matcher(str).find()
Matcher.find()方法則是僅僅進(jìn)行匹配字串的方法
如果不想使用全局匹配則可以使用Matcher.find()方法
二、附源碼#
1、String.matches(regex)#
String.matches(regex)
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
Pattern.matches(regex, this)
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
2、Matcher.find()#
Pattern.compile
public static Pattern compile(String regex) {
return new Pattern(regex, 0);
}
Pattern.matcher
public Matcher matcher(CharSequence input) {
if (!compiled) {
synchronized(this) {
if (!compiled)
compile();
}
}
Matcher m = new Matcher(this, input);
return m;
}
Matcher.find()
public boolean find() {
int nextSearchIndex = last;
if (nextSearchIndex == first)
nextSearchIndex++;
// If next search starts before region, start it at region
if (nextSearchIndex < from)
nextSearchIndex = from;
// If next search starts beyond region then it fails
if (nextSearchIndex > to) {
for (int i = 0; i < groups.length; i++)
groups[i] = -1;
return false;
}
return search(nextSearchIndex);
}
三、總結(jié)#
各個(gè)匹配的優(yōu)缺點(diǎn)都有,大家可以按需選擇
如果僅僅只需要獲取字符串中是否包含某個(gè)字符串,還是用Matcher.find()比較方便
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- Java正則表達(dá)式匹配字符串并提取中間值的方法實(shí)例
- java如何用正則表達(dá)式匹配與提取字符串
- Java正則表達(dá)式循環(huán)匹配字符串方式
- 正則表達(dá)式匹配${key}并在Java中使用的詳細(xì)方法
- java正則表達(dá)式匹配所有數(shù)字的案例
- Java正則表達(dá)式如何匹配特定html標(biāo)簽內(nèi)的內(nèi)容
- Java替換中使用正則表達(dá)式實(shí)現(xiàn)中間模糊匹配的方法
- Java基于正則表達(dá)式實(shí)現(xiàn)查找匹配的文本功能【經(jīng)典實(shí)例】
- Java使用正則表達(dá)式(regex)匹配中文實(shí)例代碼
- Java使用正則表達(dá)式進(jìn)行匹配且對匹配結(jié)果逐個(gè)替換
相關(guān)文章
Spring多定時(shí)任務(wù)@Scheduled執(zhí)行阻塞問題解決
這篇文章主要介紹了Spring多定時(shí)任務(wù)@Scheduled執(zhí)行阻塞問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
SpringBoot返回前端Long類型字段丟失精度問題及解決方案
Java服務(wù)端返回Long整型數(shù)據(jù)給前端,JS會自動(dòng)轉(zhuǎn)換為Number類型,本文主要介紹了SpringBoot返回前端Long類型字段丟失精度問題及解決方案,感興趣的可以了解一下2024-03-03
Mybatis分頁查詢主從表的實(shí)現(xiàn)示例
本文主要介紹了Mybatis分頁查詢主從表的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09
解決springboot項(xiàng)目打成jar包后運(yùn)行時(shí)碰到的小坑
這篇文章主要介紹了解決springboot項(xiàng)目打成jar包后運(yùn)行時(shí)碰到的小坑,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
JAVA中的Token 基于Token的身份驗(yàn)證實(shí)例
這篇文章主要介紹了JAVA中的Token 基于Token的身份驗(yàn)證實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08

