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 + " ");
}
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;
}
}
}
添加回答
举报