首頁  >  文章  >  Java  >  實例解析Java程式中正規表示式的貪婪模式匹配

實例解析Java程式中正規表示式的貪婪模式匹配

黄舟
黄舟原創
2017-01-20 11:10:581560瀏覽

貪婪模式又叫最大匹配,X?、X*、X+、X{n,}都是最大匹配,例如你要用“<.>”去匹配“aaava abb” ,也許你所期待的結果是想匹配“”,但是實際結果卻會匹配到“ aava ”,下面我們就來看具體看一下貪婪模式的使用.

貪婪模式(Greedy):

數量表示符預設為貪婪模式,除非另有表示。貪婪模式的表達式會一直匹配下去,直到無法匹配為止。如果你發現表達式匹配的結果與預期的不符,很有可能是因為——你以為表達式只會匹配前面幾個字符,而實際上它是貪婪模式,所以會一直匹配下去。
貪婪與非貪婪,加上?為非貪婪:

var s = &#39;1023000&#39;.match(/(\d+)(0*)/);
s
["1023000", "1023000", ""]
 
var s = &#39;1023000&#39;.match(/^(\d+)(0*)$/);
s
["1023000", "1023000", ""]
 
var s = &#39;1023000&#39;.match(/^(\d+?)(0*)$/);
s
["1023000", "1023", "000"]
 
var s = &#39;1023000&#39;.match(/(\d+?)(0*)/);
s
["10", "1", "0"]

java aspku.com/kaifa/zhengze/" target="_blank">正規表示式預設用的是greedy貪婪匹配模式既是這種類型(.*)的最長匹配,如果需要最短匹配則改為(.*?)即是勉強匹配模式。
原理分析:
如果是貪婪匹配模式,正規表示式引擎會一直匹配到字串最後,當匹配為false時,透過
回溯的方式,倒退找到倒數第一個匹配位置,返回匹配結果
如果是勉強匹配模式,正則表達式引擎會匹配到符合pattern的末尾位置那個字符,然後再往後走一步,發現匹配為false,又回溯到找到回退的最近一個匹配為true的位置,返回結果。
看程式碼:
例一:

public void test51(){ 
  String str = "aaa\"bbb\"ccc\"ddd\"eee"; 
  System.out.println(str); 
  str = str.replaceAll("\"(.*)\"", "@"); 
  System.out.println(str); 
}

輸出:

aaa"bbb"ccc"ddd"eee
aaa@eee

例二:

@Test 
 public void test52(){ 
   String str = "aaa\"bbb\"ccc\"ddd\"eee"; 
   System.out.println(str); 
     
   str = str.replaceAll("\"(.*?)\"", "@"); 
   System.out.println(str); 
     
 }

輸出:

aaa"bbb"ccc"ddd"eee
aaa@ccc@eee

以上就是實例解析程式中正規表示式的貪婪模式匹配的內容,更多相關內容請注意的內容,更多相關內容請注意PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn