因此,我有一个文档和一个指定的n-gram目标字符串。我试图找到目标字符串所有出现的索引。

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-gram)。

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


这样很好,但我的下一个问题是我必须再次“遍历”文档,并找到每个n-gram与最近的目标n-gram的距离。所以我采用完全相同的方法。除了这次,当我重新初始化匹配器并按如下所示运行循环时,

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


它会打印7次单词“ the”,而不是打印“ the”,“ lazy”,“ dog”,“ jumps”等。但是,

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


为什么是这样? matcher.group()方法如何在第一个问题而不是第二个问题中以正确的顺序调用打印出来的单词?任何方向将不胜感激;我知道这是一篇很长的帖子,对不起。

谢谢!

最佳答案

首先,一些基本知识。让我们看看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,因此该值不会改变。

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


但是,在这里,每个matcher.group调用仅打印一次match.find。这意味着您只将每个匹配的子序列打印一次,而不是lengthOfTargetNTuple次。

关于java - Java —模式— Matcher.group()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12435426/

10-12 06:13