java - 正則捕捉中(.*?)和(.*)的區別
問題描述
Java使用正則匹配捕捉1 Pattern p = Pattern.compile('name='sign' value='(.*)'/>');2 Pattern p = Pattern.compile('name='sign' value=*'(.?)**'/>');第二個比第一個多了一個?號,請問其中區別是什么
問題解答
回答1:貪婪和非貪婪的區別。
簡單來說,非貪婪是匹配到就停,不管后面還有沒有,貪婪是只要后面還符合,就不會停。
回答2:當正則表達式中包含能接受重復的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。以這個表達式為例:a.*b,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱為貪婪匹配。有時,我們更需要懶惰匹配,也就是匹配盡可能少的字符。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它后面加上一個問號?。這樣.*?就意味著匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復?,F在看看懶惰版的例子吧:a.*?b匹配最短的,以a開始,以b結束的字符串。如果把它應用于aabab的話,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)。
復制自:http://deerchao.net/tutorials... 正則表達式30分鐘入門,貪婪與懶惰部分
回答3:前者在找到一個匹配之后就會停止,而后者會找到所有匹配的目標。
回答4:這個問題涉及正則表達式中貪婪模式與懶惰模式(也稱為非貪婪模式)首先來看看這兩個的定義
貪婪模式,最大限度匹配*,+,’{n,}’,.*都屬于貪婪模式,所謂最大限度匹配,我舉個例子
var pattern = /a.*e/console.log('abcd fsdfsdfsesfdfsdfsesdfedfsdfses'.match(pattern));//結果為abcd fsdfsdfsesfdfsdfsesdfedfsdfse
懶惰模式,在匹配成功的前提下,盡可能少的去匹配。還是上面這個例子:
var pattern = /a.*?e/console.log('abcd fsdfsdfsesfdfsdfsesdfedfsdfses'.match(pattern));//結果為abcd fsdfsdfse回答5:
?會選取最小的匹配的。
相關文章:
1. 數組按鍵值封裝!2. docker不顯示端口映射呢?3. java - 阿里的開發手冊中為什么禁用map來作為查詢的接受類?4. javascript - 使用vue官方腳手架進行單元測試,如何覆蓋到watch里的變量?5. javascript - 為什么創建多行多列的表格最后只有一行內有表格6. 如何用Java向kafka發送json數據7. javascript - webpack中alias配置中的“@”是什么意思?8. clone - git sourceTree克隆倉庫時,都不停彈出Password Required彈窗,即時輸入正確的git賬號密碼還是彈出9. 主題切換問題,用過別人的webapp在后臺切換模板主題后手機端打開網頁就是切換到的主題了10. html5 - 使用echarts中的圖表 一個頁面導入了好幾個js圖表 實現echarts圖表隨著瀏覽器窗口變化而變化時出現了問題
