0

我有一个独特的问题陈述,我必须使用三个字符对输入字符串执行正则表达式。例如,如果我的输入是ABCDEFGHI,则模式搜索BCD应该返回 false,因为我将输入视为ABC+DEF+GHI并且需要将我的正则表达式模式与这些三重字符进行比较。

同样,正则表达式模式DEF将返回true,因为它匹配三元组之一。使用这个问题陈述,假设我的输入是QWEABCPOIUYTREWXYZASDFGHJKLABCMNBVCXZASXYZFGH,并且我试图获取所有以三元组开头ABC并以XYZ. 所以,在上面的输入中,我的输出应该是两个字符串:ABCPOIUYTREWXYZABCMNBVCXZASXYZ.

此外,我必须将这些字符串存储在 ArrayList 中。以下是我的功能:

public static void newFindMatches (String text, String startRegex, String endRegex, List<String> output) {
    int startPos = 0;
    int endPos = 0;
    int i = 0;
    // Making sure that substrings are always valid
    while ( i < text.length()-2) {
        // Substring for comparing triplets
        String subText = text.substring(i, i+3);
        Pattern startP = Pattern.compile(startRegex);
        Pattern endP = Pattern.compile(endRegex);
        Matcher startM = startP.matcher(subText);
        if (startM.find()) {
            // If a match is found, set the start position
            startPos = i;
            for (int j = i; j < text.length()-2; j+=3) {
                String subText2 = text.substring(j, j+3);
                Matcher endM = endP.matcher(subText2);
                if (endM.find()) {
                    // If match for end pattern is found, set the end position
                    endPos = j+3;
                    // Add the string between start and end positions to ArrayList
                    output.add(text.substring(startPos, endPos));
                    i = j;
                }
            }               
        }
        i = i+3;

    }


}

在 main 中运行此函数时,如下所示:

String input = "QWEABCPOIUYTREWXYZASDFGHJKLABCMNBVCXZASXYZFGH";
    String start = "ABC";
    String end = "XYZ";
    List<String> results = new ArrayList<String> ();
    newFindMatches(input, start, end, results);

    for (int x = 0; x < results.size(); x++) {
        System.out.println("Output String number "+(x+1)+" is: "+results.get(x));
    }

我得到以下输出:

Output String number 1 is: ABCPOIUYTREWXYZ
Output String number 2 is: ABCPOIUYTREWXYZASDFGHJKLABCMNBVCXZASXYZ

请注意,第一个字符串是正确的。但是,对于第二个字符串,程序再次从输入字符串的开头读取。相反,我希望程序在最后一个结束模式之后读取(即跳过第一个搜索和不需要的字符,例如 ASDFGHJKL,并且应该只将第二个字符串打印为:ABCMNBVCXZASXYZ

感谢您的回复

4

1 回答 1

2

这里的问题是,当您找到最终匹配项(for 循环中的 if 语句)时,您并没有停止 for 循环。所以它只是不断寻找更多的结束匹配,直到它达到 for 循环结束条件 j < text.length()-2。当你找到你的匹配并处理它时,你应该使用“break;”结束循环。放置“break;” 在 i=j 行之后。

请注意,从技术上讲,您当前程序给您的第二个答案是正确的,这也是一个以 ABC 开头并以 XYZ 结尾的子字符串。您可能需要重新考虑程序的正确输出。您可以通过在找到匹配项时不设置 i=j 来适应这种情况,以便 i 的唯一递增是 i=i+3 行,遍历三元组(而不是添加中断)。

于 2013-10-17T02:55:58.087 回答