Java 找到“索引”的正确正则表达式是什么;11111“;在;111111111111“吗;?

Java 找到“索引”的正确正则表达式是什么;11111“;在;111111111111“吗;?,java,regex,Java,Regex,我得到的上述代码的输出是 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

我得到的上述代码的输出是

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
我应该得到的输出是

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 
(意思是“找到四个1之前的1”,而不是“找到五个1”)

但使用
indexOf
更容易做到这一点:

Pattern p = Pattern.compile("1(?=1111)");

Andy Turner对您的问题的诊断是正确的,他的建议是好的,但是如果您需要匹配正则表达式而不是固定字符串,您仍然可以让它工作。关键是
Matcher.find()
有一个重载,它使用
int
指定开始位置。如果您将其设置为刚好在上一个匹配的开始位置之后,您将获得所需的结果,因为这会迫使匹配者重新考虑使用前一个1

int prev = -1;
while ((prev = in.indexOf("11111", prev + 1)) != -1) {
  System.out.println(prev + " ");
}
美国显然

在上一个匹配项未匹配的第一个字符处开始[…]


前面的答案已经提出了一些好的替代方案

您的解决方案更容易理解。我挠头想弄明白安迪·特纳的故事soution@Sneftel-您的答案将使用
pos=m.start()+1取而代之。我建议对你的答案进行修改。@AndyTurner,这很公平。我删除了它,而不是修复它,因为它似乎将
Matcher
重置为一个较早的位置,这与课程的精神背道而驰,但我认为它确实有效,所以