正則表達式
匹配次數的正則
正則表達式和正規式。在前一篇文章中,我們總結了和位置相關的正則,在這篇文章中,我們將繼續學習正則表達式其它的內容。
假如現在給你一個regular_1.txt文件,讓你找出含有連續2個a的行,應該怎么查找?這還不簡單嘛,cat ?regular_1.txt? | grep "aa" ;很好,現在換成另一個問題:找出含有連續100個a的行?。難道在命令中連續寫上100個a ?顯然太累人了。
我們完全可以利用正則解決上面這個問題,這就是這篇文章主要講述的內容。老規矩,還是先給出測試需要用到原始文件的內容。
java 正則表達式不能匹配。1
{m}
{m}?表示匹配前面字符m次,也就是說前面字符出現m次的行會被匹配,好了,實驗一把吧,查找regular_1.txt?文件中a連續出現2次的行。
正則表達式結果再次正則,看到沒,好家伙,一下輸出了這么多行,只要是連續出現了2次a以上的行都會被匹配上,這個世界究竟怎么了?我明明只是想要連續出現兩次a的行就可以了,干嘛給我返回這么多。其實很簡單。連續3個a就已經包含了連續2個a,肯定能匹配上。再看看第5行,連續4個a包含了2次連續2個a,相當于第5行匹配上了2次。
現在我們可以很輕松的寫出下面這樣的命令來找出文件中含有連續100個a的行 ?:
cat ?regular_1.txt? | grep "a{100}"
2
{m,}
{m,}?至少匹配前面字符m次,好了,我們再來查找regular_1.txt?文件中a連續?出現2次以上的行。
咋一看,好像和上面的輸出結果沒什么區別啊,但是仔細看看第4、6行,還是有些許不同的,以第3行為例,{2}形式匹配的時候第3行被匹配上是因為連續包含了2個a被匹配上,因此輸出中最后的a沒有顏色;而{2,}形式第3行被匹配上是因為連續包含了3個a才被匹配上。果相同但因卻不一樣。
3
{m,n}
{m,n}?匹配前面字符?最少m次,最多m次都可以,好了,我們再來查找regular_1.txt?文件中a連續?出現2次到3次的行。
至于第6行含有連續5個a為什么能被匹配上,通過前面的分析我想大家應該知道原因吧。
4
*
*表示其前面的字符連續出現任意次,這個任意當然包括0次了,也包括多次,好了,現在我們用*來匹配測試下。
可以看出,原始文件中無論有多少個a都被匹配出,盡管第1行不含a字符,但還是匹配出來了。
5
?
?表示其前面的字符連續出現0次或者1次,下面我們用它來匹配regular_1.txt文件中出現0次或者1次的行。
看到上面的結果嗎,竟然和*匹配的結果是一樣的,盡管結果一樣,但是匹配的原理是不同的。以第3行為例,如果使用*匹配,則第3行是以因為其連續含有2個a被匹配上的;而如果是以?匹配,則第3行被匹配上是因為先匹配了上1個a,再匹配上后面的a,相當于匹配上了2次。所以有時候看事務是不能只看表面的。
6
+
+?表示其前面的字符連續出現1次或者多次,也就是說,+前面的字符至少要連續出現一次才能匹配上。如果我們需要查找文件中出現過a字符的行,我們可以使用下面的命令。
總結
主要總結了正則表達式中關于次數匹配相關的正則,后面還會總結正則表達式其它的規則,希望對大家有所幫助,文章中如有遺漏或錯誤之處,還望大家指出!
推薦閱讀:
專注服務器后臺技術棧知識總結分享
歡迎關注交流共同進步
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态