2012-09-15 70 views
1

所以我有一個文檔和一個指定的n-gram目標字符串。我試圖找到所有出現的目標字符串的索引。Java - 模式 - Matcher.group()?

final Pattern WORD_PATTERN = Pattern.compile("\\w+"); 
Matcher matcher = WORD_PATTERN.matcher("the lazy dog, jumps, the lazy dog."); 

所以字符串是「懶狗,跳,懶狗」。

說我的目標n-gram是「懶惰的」。我基本上按以下方式對整個字符串進行「迭代」,在鏈表中添加'n'個單詞currentNGram。如果currentNGram中的所有單詞都與目標n-gram匹配,則保存索引。否則,我刪除鏈表的第一個元素,並在輸入字符串中的下一個單詞上附加(例如,檢查文檔中的下一個連續的n元組)。

while (matcher.find()) { 
    while (currentNGram.size() < lengthOfTargetNTuple) { 
     currentNGram.add(matcher.group().toLowerCase()); 
      System.out.println(currentNGram.getLast()); 
    } 
} 

所以這是所有罰款和花花公子,但我的下一個問題是,我要通過文件「迭代」一遍,找到最近的目標正克每n元的距離。所以我採用完全相同的方法。只是這一次,當我重新初始化匹配,並運行循環如下,

while (matcher.find()) { 
     while (currentGram.size() < lengthOfTargetNTuple) { 
      currentGram.add(matcher.group().toLowerCase()); 
        System.out.println(currentGram.printLast()) // Psuedocode 
     } 

它打印字「的」 7倍,而不是印刷「的」,「懶」,「狗」,「跳躍」等但是,

while (matcher.find()) { 
     while (currentGram.size() < lengthOfTargetNTuple) { 
      currentGram.add(matcher.group().toLowerCase()); 
     } 
     System.out.println(matcher.group()); // Prints words in order, correctly 
} 

這是爲什麼? matcher.group()方法調用在第一個問題中按正確順序打印出單詞,但不是第二個單詞?任何方向將不勝感激;我知道這是一個很長的帖子,對不起。

謝謝!

回答

1

首先是一些基礎知識。讓我們看看Matcher.find做什麼...

嘗試找到匹配模式的輸入序列的下一個子序列。 該方法從匹配器區域的開始處開始,或者如果以前的方法調用成功並且匹配器尚未重置,則在第一個與先前匹配不匹配的字符處。

接下來,讓我們來看一看在Matcher.group

返回由以前匹配所匹配的輸入子序列。現在


,我們瞭解他們的工作,讓我們來看看下面的循環做什麼。

while (matcher.find()) { 
    while (currentGram.size() < lengthOfTargetNTuple) { 
     currentGram.add(matcher.group().toLowerCase()); 
       System.out.println(currentGram.printLast()) // Psuedocode 
    } 
} 

要打印currentGram.printLast幾次每matcher.find通話 - 準確地說,lengthOfTargetNTuple倍。 currentGram.printLast必須導致剛剛添加的那個 - matcher.group().toLowerCase()。由於我們在整個循環中只調用了一次matcher.find,所以這個值不會改變。

但在這裏,您打印matcher.groupmatch.find調用一次。這意味着您只打印每個匹配的子序列一次,而不是lengthOfTargetNTuple次。