在“ 111111111111111”中找到索引“ 11111”的正确正则表达式是什么?

时间:2019-05-24 15:01:59

标签: 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 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 

有人可以告诉我我在做什么错吗?

3 个答案:

答案 0 :(得分:12)

  

有人可以告诉我我在做什么错吗?

您假设您将从匹配中已使用的文本中获取匹配。你不会的。

您可以使用前瞻性断言来做到这一点:

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

(这意味着“查找四个1之前的1”,而不是“查找五个1”)

Ideone demo

但是使用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)

documentation清楚地说明

  

[...]从与上一个匹配项不匹配的第一个字符开始

先前的答案已经提出了一些不错的选择。