String.matches(“((\\ w)\\ 1”)在长度超过100

时间:2017-08-03 08:09:42

标签: java regex string

问题陈述:当我在代码中使用String.matches("(\\w)\\1")时。

在对长度超过100的字符串执行某些尝试后,它会给出不一致的结果

复制此问题的步骤:

创建java类:

import java.util.Scanner;

public class ReducedString {

    static String super_reduced_string(String s){
        boolean isStringFinished = false;
        String newString = "";
        while(!isStringFinished) {
            newString = s.replaceAll("(\\w)\\1","");
            s = newString;
            if(!s.matches("(\\w)\\1")){
                isStringFinished = true;
            }
        }
        if(newString.length() == 0 )
            newString = "Empty String";
        return newString;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        String result = super_reduced_string(s);
        System.out.println(result);
    }
}

请运行它并提供以下字符串作为输入:

  

oagciicgaoyjmahhamjymmwjnnjwmmvpxhpphxpvlikappakilyygvkkvgyymlpfddfplmhiodvvdoihfxpkggkpxfuevvuuvveu

基本上代码逻辑试图删除所有相邻的相似内容     字符和减少输入字符串所以预期应该是:     “空字符串”。但是不会得到这个结果。

为了获得预期的输出,我尝试使用方法matchPattern()

进行下面的解决方法
import java.util.Scanner;

public class ReducedString {

    static String super_reduced_string(String s){
        boolean isStringFinished = false;
        String newString = "Empty String";
        while(!isStringFinished) {
            newString = s.replaceAll("(\\w)\\1","");
            s = newString;
            if(!matchPattern(s)){
                isStringFinished = true;
            }
        }
        if(newString.length() == 0 )
            newString = "Empty String";
        return newString;
    }

    static boolean matchPattern(String s) {
        boolean isStringFinished = false;

        for(int i = 0 ; i < s.length()-1;i++) {
            char c1 = s.charAt(i);
            char c2 = s.charAt(i+1);  
            if(c1==c2)
                return true;
        }
        return isStringFinished;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        String result = super_reduced_string(s);
        System.out.println(result);
    }
}

如果有人遇到同样的问题,请你告诉我为什么内置功能会产生这种不一致的结果

2 个答案:

答案 0 :(得分:1)

正如Usagi Miyamoto在评论中所说,问题是使用String.matches()只匹配整个字符串。

此外,由于您经常使用该模式,因此在使用之前对其进行编译将加快该过程,从而加快速度。我让它像这样工作:

import java.util.*;
import java.util.regex.*;
import java.lang.*;
import java.io.*;
import java.util.Scanner;

class ReducedString {
    static String super_reduced_string(String s){
        Pattern p = Pattern.compile("(\\w)\\1"); // precompile pattern
        while(s.length() > 0 && !p.matcher(s).matches()){ 
        // check on the length to avoid matching the empty string
            s = p.matcher(s).replaceAll("");
        }
        if(s.length() == 0 ){
            s = "Empty String";
        }
        return s;
    }

    public static void main(String[] args) {
        String result = super_reduced_string("oagciicgaoyjmahhamjymmwjnnjwmmvpxhpphxpvlikappakilyygvkkvgyymlpfddfplmhiodvvdoihfxpkggkpxfuevvuuvveu");
        System.out.println(result);
    }
}

答案 1 :(得分:0)

致电str.matches(regex)相当于Pattern.matches(regex, str),相当于Pattern.compile(regex).matcher(str).matches()

Matcher.matches()方法尝试将整个输入序列与模式匹配。

请参阅: