av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java正則表達(dá)式匹配不到結(jié)果的解決

瀏覽:3日期:2022-08-16 13:42:56
如下所示:

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:APPLOCKn' + 'Rev:n' + '可用資源鎖定成功, 60 秒內(nèi)沒(méi)有輸入指令資源將被Buk收回n' + 'Send:IGn' + 'Rev:n' + 'NO PNRn' + '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' AGAINn' + 'Send:IGn' + '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)容

在本地測(cè)試時(shí)可以匹配出來(lái),但是在線上就不行。

真的是百思不得其解……

后來(lái)認(rèn)真比對(duì)了一下線上傳入的str和本地復(fù)制過(guò)來(lái)的str,發(fā)現(xiàn)了了一個(gè)微小的不同

線上傳入的str行分隔符是rn,而復(fù)制粘貼到本地之后都變成了n

而我的正則表達(dá)式中只匹配了n的情況,因此出現(xiàn)這樣的bug

提醒自己要注意系統(tǒng)之間的差別,win上的行分隔符是n,而Linux是rn

為了能適配所有的環(huán)境,可以直接用System.lineSeparator()來(lái)替代,當(dāng)然也可以把表達(dá)式寫(xiě)成這樣(

<DetailInfo>((.|n|rn')*?)</DetailInfo>

補(bǔ)充:Java正則表達(dá)式匹配的坑

今天在判斷字符串是否存在某個(gè)字符串,直接用String.matches(regex),死活匹配不出來(lái),在線正則工具用了很多都是可以的,后面找到問(wèn)題,總結(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ū)域與模式匹配,如果匹配成功,則可以通過(guò)開(kāi)始、結(jié)束和組方法獲得更多信息。

即這個(gè)方法會(huì)在表達(dá)式前后加上$(regex$),是對(duì)這個(gè)字符串全匹配

而不會(huì)只匹配其中的子串,如果只想匹配子串,則需要表達(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è)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日韩精品一区在线观看 | 亚洲二区在线观看 | 欧美黄色精品 | 我要操网站 | 亚洲欧美一区二区三区在线 | 超碰com| 久久人人爱 | 久久不雅视频 | 中文字幕在线免费 | 日韩精品三区 | 91精品国产99久久久久久红楼 | 在线播放av网站 | 日韩在线不卡视频 | www.伊人网| 日日夜夜狠狠 | av每日更新 | 在线观看www | 五月天婷婷激情 | 91亚洲国产成人精品性色 | 成人免费毛片嘿嘿连载视频 | 麻豆91在线 | 久久精品国产精品 | 911精品国产一区二区在线 | 国产一区二区在线看 | 日韩免费观看 | 亚洲一级精品 | 亚洲视频一区二区三区四区 | 亚洲一级特黄 | 精品一区av | 国产欧美精品一区二区 | 99久热| 在线免费毛片 | 亚洲成在线 | 在线免费观看黄色片 | 日韩免费视频一区二区 | 国产精品一二三四区 | 久久久久久黄色 | 免费国产黄色 | 中文字幕亚洲一区 | 国产欧美精品一区二区色综合 | 欧美性久久|