2011-10-24 21 views
2

我使用while(matcher.find())循環並從文件中檢索事物。我想知道如果我知道我發現的索引是matcher.start(),我將如何從這個循環中得到一個行號。使用matcher.start()獲取matcher.find()中的行號

我很困惑,請問有人能解釋一下嗎?

String expr = "<[^<?!>]+>"; 
    String[] response = new String[5]; 

     Pattern p = Pattern.compile(expr); 
     Matcher m = p.matcher(xmlDocument); 
     while (m.find()) { 
     // System.out.println(m.group() + " located at " + m.start()); 
     // txtMatches.append(m.group() + " located at " + m.start() + "\n"); 
      if (itemStack.getCount() == 0 && m.group().contains("</")) { 
       response[0] = "Orphan closing tag" ; 
       response[1] = stripUnwantedChars(m.group(), true); 
       response[2] = String.valueOf(m.start()); //right here is where i want to return line number 
       return response; 
      } 
     //rest of code 

itemStack是推火柴堆,然後我比較它們,看看是否有在棧中沒有更多的項目,但有一個結束標記匹配。

+0

您是爲每一行構建一個單獨的匹配器,還是爲整個文件內容構建一個單獨的匹配器?一些代碼會很好。 –

+0

不必爲每行分開匹配器。一個用於整個文件。並通過找到所有文本循環使用這個正則表達式=「<[^] +>」讓我看看我是否可以簡化一些代碼張貼 – Pengume

回答

2

您需要單獨創建每行開始的索引數組,然後您可以使用此數組和start()返回的索引來確定您的匹配所在的行。該行索引數組的二進制搜索可以很好地完成。你實際上也可以通過使用匹配行結束符的正則表達式(只匹配'\ n'就可以),然後在下一個字符處開始每一行來創建這個行索引列表。

+0

謝謝厄內斯特,但我不太明白,我張貼了一些代碼,以更好地解釋我在試圖去做。 – Pengume

+0

運行上面的代碼之前,運行一些類似的代碼來查找文件中的所有行結束符。將他們的文件索引保留在列表或數組中。現在你有一個每行的第一個字符偏移量的列表。然後,當你在上面運行你的代碼時,你調用matcher.start()來獲得一個偏移量,並且你想知道行號,你只需要搜索該數組,直到找到比你的偏移量小的最大條目。該條目的索引是行號。真的沒有其他辦法可以做到這一點! –

+0

好的,謝謝你已經證實了我正在嘗試的東西。謝謝! – Pengume

2

通過創建從0到從start()返回的字符編號的區域,可以使用反向方法獲取行號。

例如,

class MatchTest { 
public static void main(String...args) { 
    try { 
     FileInputStream fis = new FileInputStream("source.txt"); 
     byte[] buffer = new byte[fis.available()]; 
     fis.read(buffer); 
     String data = new String(buffer); 
     fis.close(); 


     Pattern pattern = Pattern.compile(args[0]); 
     Matcher matcher = pattern.matcher(data); 
     while(matcher.find()) { 
      out.println(matcher.group()); 
      out.println(getLine(data, matcher.start())); 


     } 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

static int getLine(String data, int start) { 
    int line = 1; 
    Pattern pattern = Pattern.compile("\n"); 
    Matcher matcher = pattern.matcher(data); 
    matcher.region(0, start); 
    while(matcher.find()) { 
     line++; 
    } 
    return(line); 
} 

}

在此,函數getline方法將返回的行號。