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
重置为一个较早的位置,这与课程的精神背道而驰,但我认为它确实有效,所以