如何使用正則匹配最后一個(gè)字符串詳解
前幾天遇到一個(gè)需求,輸入的是
<user> <user> <name>a</name> </user> <user> <name>a</name> </user> </user> <password>123</password>
要求拿到
<user> <user> <name>a</name> </user> <user> <name>a</name> </user> </user>
也就是去掉最后一個(gè)</user>
后面的字符串。
方法有很多,我首先想到的是用正則匹配去掉</user>
后面的字符串。
最后寫出來的表達(dá)式是
(?<=</user>)(?![\w\W]*</user>)[\w\W]+
。
首先用(?<=</user>)
匹配所有前面是</user>
的位置,如圖,總共有三個(gè)位置。
這里我們正則表達(dá)式(?<=</user>)
的意思就是匹配的位置之前的字符串是</user>
,也就是我們匹配到的位置在</user>
之后。
這里用到了正則表達(dá)式語法中的斷言,有的書上也稱該語法為預(yù)查或者環(huán)視,都是一樣的用法。有如下語法:
(?=pattern) 零寬正向先行斷言 (?!pattern) 零寬負(fù)向先行斷言 (?<=pattern) 零寬正向后行斷言 (?<!pattern) 零寬負(fù)向后行斷言
這里用到的是(?<=pattern),零寬表示它匹配的是在字符串中的位置,如同^匹配字符串串首,$匹配字符串串尾。正向代表它必須滿足pattern。后行代表它匹配的位置在pattern之后。
其次,再這三個(gè)位置上進(jìn)行篩選,能夠看出這三個(gè)位置的區(qū)別是后面是否有</user>
,如果沒有的話那么它就是最后一個(gè)</user>
后面的位置。在之前的表達(dá)式后面添上(?![\w\W]*?</user>)
此時(shí)表達(dá)式變?yōu)?code>(?<=</user>)(?![\w\W]*?</user>)。
能夠看到得到了最后一個(gè)匹配結(jié)果。
這里的正則表達(dá)式(?!pattern) 是零寬負(fù)向先行斷言,也就是它會往后匹配pattern,匹配到的位置在pattern之前,并且匹配到的字符串必須不滿足pattern。
(?![\w\W]*?</user>)
的意思是在匹配到的位置后面必須不是[\w\W]*?</user>
,\w匹配的是[a-zA-Z0-9_]即匹配字母數(shù)字和下劃線,而\W匹配的是[^a-zA-Z0-9_]即不是字母數(shù)字也不是下劃線的字符,同時(shí)匹配這兩個(gè)就相當(dāng)于匹配任意字符。[\w\W]后面的*代表匹配0-任意多次,后面的?代表懶惰模式,即只要滿足條件就立即返回。
最后,在之前的正則表達(dá)式后面加上[\w\W]+
貪婪匹配即盡可能多的匹配該位置后面的字符串。最終的正則表達(dá)式是(?<=</user>)(?![\w\W]*?</user>)[\w\W]*
最后的最后用四張圖簡單地描述四種斷言的不同之處。
這里輸入的字符串都是123456。
(?=3)
,它匹配的位置是后面的字符為3的位置。
(?<=3)
,它匹配的位置是前面的字符為3的位置。
(?!3)
匹配的位置是后面的字符不為3的位置,可以看到箭頭所指的地方?jīng)]有被匹配到,其他位置都被匹配到了。
(?<!3)
匹配的位置是前面的字符不為3的位置,可以看到箭頭所指的地方?jīng)]有被匹配到,其他位置都被匹配到了。
總結(jié)
到此這篇關(guān)于如何使用正則匹配最后一個(gè)字符串詳解的文章就介紹到這了,更多相關(guān)正則匹配最后一個(gè)字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python正則表達(dá)式的7個(gè)使用典范(推薦)
這篇文章主要介紹了Python正則表達(dá)式的7個(gè)使用典范,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11正則表達(dá)式中環(huán)視的簡單應(yīng)用示例【基于java】
這篇文章主要介紹了正則表達(dá)式中環(huán)視的簡單應(yīng)用,簡單分析了環(huán)視的概念與功能,并基于java給出了正則表達(dá)式環(huán)視的具體使用技巧,需要的朋友可以參考下2017-04-04JScript中正則表達(dá)函數(shù)的說明與應(yīng)用
JScript中正則表達(dá)函數(shù)的說明與應(yīng)用...2006-06-06Java中使用正則表達(dá)式處理文本數(shù)據(jù)
正則表達(dá)式就是一個(gè)字符串,但和普通的字符串不同的是,正則表達(dá)式是對一組相似字符串的抽象。本文將給大家介紹java中使用正則表達(dá)式處理文本數(shù)據(jù)的相關(guān)的資料,感興趣的朋友一起看看吧2015-10-10如何使用正則表達(dá)式對輸入數(shù)字進(jìn)行匹配詳解
正則表達(dá)式用于字符串處理、表單驗(yàn)證等場合,實(shí)用高效,下面這篇文章主要給大家介紹了關(guān)于如何使用正則表達(dá)式對輸入數(shù)字進(jìn)行匹配的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10一個(gè)正則表達(dá)式導(dǎo)致CPU 利用率居高不下
這篇文章給大家?guī)砹艘粋€(gè)正則表達(dá)式導(dǎo)致CPU 利用率居高不下,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06正則表達(dá)式檢查來訪IP是否合法的實(shí)際應(yīng)用
正則表達(dá)式檢查來訪IP是否合法的實(shí)際應(yīng)用...2007-04-04