2015-11-01 44 views
0

我嘗試了java的正則表達式量詞java的正則表達式不願意量詞給貪婪的量詞

Pattern p = Pattern.compile("^s(.*?)n$"); 
    Matcher m = p.matcher("sensation"); 
    if(m.matches()){ 
     System.out.println("dude how is this even possible"); 
     System.out.print(m.group() + m.start()+m.end()+"\n"); 



    }else { 
     System.out.println("sorry dude someting wrong"); 
    } 

,因爲它是relecutant量詞它應該給出的結果 仙 sation

而是即時得到的感覺在那裏它出錯了還是我錯過了什麼

回答

2

你已經告訴程序兩次你的模式需要匹配整個串。這就是爲什麼它不能僅僅匹配"sen"部分,即使你使用了一個不情願的限定詞。

(1)模式末尾的$匹配字符串的末尾;它不會讓你匹配"sen",因爲"sen"後面沒有跟着字符串的結尾。 (2)您正在使用m.matches(),它只在整個字符串匹配時才返回true。請參閱matches的定義。

刪除$並將matches()更改爲find()

+0

感謝從比賽改變後發現我得到了部分答案,即森。我沒有得到第二個結果的原因是什麼 – javaworld

+0

你輸出'm.group()',它輸出你匹配的部分,即'sen'。您沒有輸出其他任何會輸出輸入字符串的不同部分的內容。你的原代碼輸出'm.start()'和'm.end()',它們是'int's。你在輸出中看到了那些嗎?無論如何,如果's'是輸入字符串,則匹配後的字符串部分將是's.substring(m.end())'。這將返回輸入字符串的部分,從匹配後的字符開始,一直到輸入字符串的末尾。 – ajb

+0

@javaworld:正則表達式引擎只能找到不重疊的匹配項。可以解決這個問題,並找到從不同位置開始的重疊匹配(通過使用預見),但無法找到從相同位置開始的重疊匹配。 – nhahtdh