我有一个程序可以对非常大的字符串(大约 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 内存。