繁体   English   中英

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

[英]Reusing the consumed characters in pattern matching in java?

考虑以下模式:

aba

还有傻瓜。 源字符串:-

abababbbaba

01234567890    //Index Positions

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

如果我想重用一部分已经消耗的字符怎么办。 也就是说,我要在这里进行3场比赛,一场在位置0,一场在2(之前已被忽略),一场在8。

我该怎么做??

我认为您可以使用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

您可以为此使用前瞻性 现在,你拥有的是在第一位置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部分,这只是向您显示它匹配的内容和位置。

如果您可以更改正则表达式,则可以简单地使用以下命令:

a(?=ba)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM