我目前有一个与特定单词匹配的正则表达式模式,其中包含任意空格。
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++;
}
我想返回最多连续重复次数。 只是好奇是否有办法用正则表达式做到这一点。
答案 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值,就返回序列中之前最匹配的数字。