用Java中的正则表达式计算一个单词的连续重复

时间:2012-02-13 03:02:05

标签: java regex

我目前有一个与特定单词匹配的正则表达式模式,其中包含任意空格。

e.g。如果单词是“the”,我的模式将匹配“t h e”以及“the”

我的问题是,有没有办法计算和跟踪连续重复的次数? 我期待返回最大量的连续重复。

e.g。如果我的字符串是“快速的棕色狐狸,它就跳过......”

我希望我的方法返回3而不是7.计算总出现次数非常简单:

Pattern p = Pattern.compile("(t\\s*h\\s*e\\s*)");
Matcher m = p.matcher(s);

while(m.find()) {
    count++;
}

我想返回最多连续重复次数。 只是好奇是否有办法用正则表达式做到这一点。

2 个答案:

答案 0 :(得分:0)

这是未经测试的,但我相信逻辑是合理的。确保检查所有位置和长度的一个错误。

boolean adjacentToPreviousMatch = false;
int previousPosition = 0;
int lengthOfCurrentMatch = 0;
int numSequentialMatches = 0;
ArrayList<Integer> sequences = new ArrayList<Integer>(); 
while (m.find()) {
    if (numSequentialMatches > 0 ) {
        lengthOfCurrentMatch = m.end() - m.start();
        adjacentToPreviousMatch = previousPosition + lengthOfCurrentMatch == m.end();
        if (adjacentToPreviousMatch) {
            numSequentialMatches++;
        } else {
            sequences.add(numSequentialMatches);
            numSequentialMatches = 0;
        }
    }

    previousPosition = m.end();
}

然后你可以遍历序列来找到最大序列。确保在模式中保留尾随\s*

- 另一种方法可能是使用复数模式"(t\\s*h\\s*e\\s*)*"然后循环匹配,提取捕获的字符串。然后,在捕获的字符串上运行单数正则表达式"(t\\s*h\\s*e\\s*)",然后执行while(m.find()) count++;,因为您知道它们是相邻的。

答案 1 :(得分:0)

我相信我想出了一个明智的解决方案:

// Possible values for n:
// (t\\s*h\\s*e\\s*){1}
// (t\\s*h\\s*e\\s*){2}
// (t\\s*h\\s*e\\s*){3}...
public int consecutiveThe(String s) {
    int n = 0;
    while(true) {
         String expression = "(t\\s*h\\s*e\\s*){" + n + "}";
         Pattern p = Pattern.compile(expression);
         Matcher m = p.matcher(s);
         if(!m.find()) {
            break;
         }
         n++;
    }
    return (n - 1);
}

这个想法是遍历n的连续值,检查是否存在正则表达式匹配。只要我们有一个无法匹配的n值,就返回序列中之前最匹配的数字。