2013-09-30 29 views
0

我的示例代碼正則表達式表達:的Java:對lastindexOf

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Test { 

    /** 
    * @param args 
    */ 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     String str[] = {"A","B","C"}; 
     String s = "TEST FOR A STRING CONSTANT B. END."; 
     int retIndex = -1; 

     for (int i = 0, len = str.length; i < len; i++){ 
      //length-1 is because, we should not check the empty space unicode(\u0021) 

      int index = s.lastIndexOf(str[i]); 
      if(index>retIndex){ 
       retIndex = index; 
      } 
     } 
     System.out.println("RETINDEX"+retIndex); 

     Pattern pattern = Pattern.compile("A|B|C"); 
     Matcher m = pattern.matcher(s); 

     while(m.find()){ 
      retIndex = m.start(); 
      System.out.println(m.group()+" : "+m.end()+" : "+m.start()); 
     } 

     System.out.println("REGEX RETINDEX"+retIndex); 
    } 
} 

而且我得到的輸出:

RETINDEX27 
A : 10 : 9 
C : 19 : 18 
A : 24 : 23 
B : 28 : 27 
REGEX RETINDEX27 

我只希望最大輸出指數。無需執行其他三個循環。如何爲我的需要改變上面的一個?確切地說lastindex與正則表達式匹配。

.*(A|B|C) 

鑑於您的測試字符串.*會匹配一切到:

感謝

+0

什麼是您預期的輸出? –

回答

9

您可以通過之前寫的一切貪婪的比賽,例如找到一個正則表達式的最後一次出現最後一個B,你可以從捕獲組中獲得B.

要訪問捕獲組使用採取int參數的方法:

Pattern pattern = Pattern.compile(".*(A|B|C)"); 
    Matcher m = pattern.matcher(s); 
    if (m.find()) { 
     retIndex = m.start(1); 
     System.out.println(m.group(1)+" : "+m.end(1)+" : "+m.start(1)); 
    } 
+0

簡單而優雅。 (爲了安全起見,可能在開始時添加'(?s)',因此即使換行符也會被'。*')匹配。 –

+0

但它返回m.start()爲0.爲什麼? – user1023675

+0

作爲一個整體的模式匹配從一開始的字符串。您必須獲取捕獲組的起始位置以獲取B的索引:m.start(1) – Joni