在java中重用模式匹配中消耗的字符?

时间:2012-01-23 07:38:19

标签: java regex pattern-matching

考虑以下模式: -

aba

而且是的。源字符串: -

abababbbaba

01234567890    //Index Positions

使用java.util.regex包中的Pattern和Matcher类,只发现此模式两次,因为正则表达式不考虑已经消耗的字符。

如果我想重用已经消耗的部分字符,该怎么办?也就是说,我想要3个匹配,一个在0位,一个在2(之前被忽略),一个在8。

我该怎么办?

3 个答案:

答案 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)