0

我有一个程序可以对非常大的字符串(大约 100K)进行字符串操作。我的程序的第一步是清理输入字符串,使其仅包含某些字符。这是我的清理方法:

    public static String analyzeString (String input) {
    String output = null;

    output = input.replaceAll("[-+.^:,]","");
    output = output.replaceAll("(\\r|\\n)", "");
    output = output.toUpperCase();
    output = output.replaceAll("[^XYZ]", "");
    return output;
}

当我打印长度为 97498 的“输入”字符串时,它打印成功。清理后的输出字符串长度为 94788。我可以使用 output.length() 打印大小,但是当我尝试在 Eclipse 中打印时,输出为空,我可以在 Eclipse 输出控制台标题中看到。由于这不是我的最终程序,所以我忽略了这一点并继续使用下一个方法对这个“清理”字符串进行模式匹配。这是模式匹配的代码:

    public static List<Integer> getIntervals(String input, String regex) {
    List<Integer> output = new ArrayList<Integer> ();
    // Do pattern matching
    Pattern p1 = Pattern.compile(regex);
    Matcher m1 = p1.matcher(input);

    // If match found
    while (m1.find()) {
        output.add(m1.start());
        output.add(m1.end());
    }


    return output;
}

基于这个程序,我将模式匹配的开始和结束间隔标识为 12351 和 87314。我尝试将此匹配打印为 output.substring(12351, 87314) 并且只得到空白输出。无数次命中和试运行得出的结论是,我可以打印的最大子字符串的长度为 4679。如果我尝试 4680,我再次得到空白输入。我的困惑是,如果我能够打印原始字符串(97498)长度,为什么我不能打印清理后的字符串(长度 94788)或子字符串(长度> 4679)。是否由于正则表达式实现可能导致一些内存问题而我的系统无法处理?我安装了 4GB 内存。

4

2 回答 2

1

似乎 Eclipse 控制台输出的限制很小。您可以在
Window-> Preferences-> Run/Debug->中更改它,您可以在Console
此处删除限制或增加控制台缓冲区。


顺便说一句,您的第一种方法似乎重新遍历了您的字符串几次。创建一个匹配您要删除的每个字符并仅遍历输入一次的正则表达式不是更好吗?在您的情况下,仅使用[^XYZ](或(?i)[^XYZ]匹配大小写字母)应该可以解决问题,因为它包含[-+.^:,]and (\\r|\\n)

于 2013-11-10T15:09:00.957 回答
1

尝试将字符串写入文件。

于 2013-11-10T15:48:38.627 回答