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

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 

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


动漫人物
浏览 104回答 3
3回答

叮当猫咪

有人可以告诉我我做错了什么吗?您假设您将从匹配中已使用的文本中获取匹配项。你不会的。您可以使用前瞻性断言来做到这一点: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 + " ");}

心有法竹

Andy Turner 对您的问题的诊断是正确的,他的建议也很好,但是如果您需要匹配正则表达式而不是固定字符串,您仍然可以让它工作。关键是它Matcher.find()有一个重载,它需要一个int指定的起始位置。如果将其设置为紧接上一场比赛的开始位置之后,您将获得所需的结果,因为它会强制匹配器重新考虑使用之前的那些 1。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);        int pos = 0;        while (m.find(pos)) {            System.out.print(m.start() + " ");            pos = m.start() + 1;        }    }}

斯蒂芬大帝

文件说得很清楚开始 [...] 在与上一个匹配项不匹配的第一个字符处之前的答案已经提出了一些不错的选择。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java