非常に大きな文字列 (約 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 として識別します。多数のヒットと試運転の結果、印刷できる最大の部分文字列の長さは 4679 であるという結論に達しました。4680 を試してみると、再び空白の入力が得られます。私の混乱は、元の文字列 (97498) の長さを出力できた場合、クリーンアップされた文字列 (長さ 94788) または部分文字列 (長さ >4679) を出力できなかった理由です。メモリの問題を引き起こしている可能性がある正規表現の実装が原因で、私のシステムはそれを処理できませんか? 私は4GBのメモリを搭載しています。