为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

动漫人物 2022-12-15 14:59:47
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 回答

?
叮当猫咪

TA贡献1776条经验 获得超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 + " ");

}


查看完整回答
反对 回复 2022-12-15
?
心有法竹

TA贡献1866条经验 获得超5个赞

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;

        }


    }

}


查看完整回答
反对 回复 2022-12-15
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

文件说得很清楚

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

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


查看完整回答
反对 回复 2022-12-15
  • 3 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信