考虑以下模式: -
aba
而且是的。源字符串: -
abababbbaba
01234567890 //Index Positions
使用java.util.regex包中的Pattern和Matcher类,只发现此模式两次,因为正则表达式不考虑已经消耗的字符。
如果我想重用已经消耗的部分字符,该怎么办?也就是说,我想要3个匹配,一个在0位,一个在2(之前被忽略),一个在8。
我该怎么办?
答案 0 :(得分:4)
我认为你可以使用indexOf()来做类似的事情。
String str = "abababbbaba";
String substr = "aba";
int location = 0;
while ((location = str.indexOf(substr, location)) >= 0)
{
System.out.println(location);
location++;
}
打印:
0,2和8
答案 1 :(得分:2)
您可以使用look ahead。现在你拥有的是group(1)
中的第一个位置和group(2)
中的第二个位置。两者都在你正在搜索的句子中制作长度为3的每个字符串。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Question8968432 {
public static void main(String args[]) {
final String needle = "aba";
final String sentence = "abababbbaba";
final Matcher m = Pattern.compile("(.)(?=(..))").matcher(sentence);
while (m.find()) {
final String match = m.group(1) + m.group(2);
final String hint = String.format("%s[%s]%s",
sentence.substring(0, m.start()), match,
sentence.substring(m.start() + match.length()));
if (match.equals(needle)) {
System.out.printf("Found %s starting at %d: %s\n",
match, m.start(), hint);
}
}
}
}
输出:
Found aba starting at 0: [aba]babbbaba
Found aba starting at 2: ab[aba]bbbaba
Found aba starting at 8: abababbb[aba]
您可以跳过final String hint
部分,这只是为了向您展示它匹配的内容和位置。
答案 2 :(得分:0)
如果您可以更改正则表达式,那么您可以使用以下内容:
a(?=ba)