import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
String in = "111111111111111";
Pattern p = Pattern.compile("(11111)");
Matcher m = p.matcher(in);
while (m.find()) {
System.out.print(m.start() + " ");
}
}
}
我得到的上述代码的输出是
0 5 10
我应该得到的输出是
0 1 2 3 4 5 6 7 8 9 10
有人可以告诉我我在做什么错吗?
答案 0 :(得分:12)
有人可以告诉我我在做什么错吗?
您假设您将从匹配中已使用的文本中获取匹配。你不会的。
您可以使用前瞻性断言来做到这一点:
Pattern p = Pattern.compile("1(?=1111)");
(这意味着“查找四个1之前的1”,而不是“查找五个1”)
但是使用indexOf
这样做更容易:
int prev = -1;
while ((prev = in.indexOf("11111", prev + 1)) != -1) {
System.out.println(prev + " ");
}
答案 1 :(得分:3)
安迪·特纳(Andy Turner)对您的问题的诊断是正确的,并且他的建议是一个很好的建议,但是如果您需要使用正则表达式而不是固定字符串进行匹配,则仍然可以使用它。关键是first-child
有一个重载,它需要一个Matcher.find()
指定起始位置。如果将其设置为上一场比赛的开始位置之后,您将获得理想的结果,因为它会迫使比赛者使用以前的1来重新考虑。
int
答案 2 :(得分:1)