Java: remplacement de regex dans des fichiers volumineux

Java java.util.regex.Matcher replaceFirst(...) / replaceAll(...) API renvoie des chaînes qui (si vous utilisez la taille de segment par défaut) risquent de générer un OOME pour des entrées de 20 à 50 millions de caractères. Ces 2 méthodes peuvent être facilement réécrites pour écrire à Writer plutôt que de construire des stings, éliminant ainsi un sharepoint défaillance.

Cependant, la méthode factory de CharSequence n’accepte que les caractères CharSequence , qui risquent également de lancer un OOME si j’utilise Ssortingng s / SsortingngBuffer s / SsortingngBuilder s.

Comment envelopper un java.io.Reader pour implémenter une interface CharSequence (étant donné que mes expressions rationnelles peuvent contenir des références arrière )? Existe-t-il une autre solution qui puisse remplacer les expressions rationnelles dans les fichiers et n’est pas sujette à OOME sur les entrées de grande taille?

En d’autres termes, comment puis-je implémenter une fonctionnalité similaire à celle de GNU sed en Java (car sed est connu pour traiter des fichiers aussi gros que quelques téraoctets, tout en offrant le même support pour les expressions régulières étendues)?

Puisque ce dont vous avez besoin est en fait le comportement sed , vous pouvez l’exécuter en procédant comme suit:

 Ssortingng[] cmdArray = {"bash", "-c", "sed 's/YourRegex/YourReplaceStr/' inputfile > output"}; Process runCmd = Runtime.getRuntime().exec(cmdArray); 

Je mets un exemple bash mais si vous voulez l’exécuter sur Windows, vous pouvez installer la commande sed via Cygwin et l’exécuter de la même manière ou tout simplement installer la commande sed pour Windows que vous pouvez télécharger à partir d’ici:

http://gnuwin32.sourceforge.net/packages/sed.htm

Pour les fenêtres, vous pouvez utiliser:

 Ssortingng[] cmdArray = {"call", "sed 's/YourRegex/YourReplaceStr/' inputfile > output"}; Process runCmd = Runtime.getRuntime().exec(cmdArray); 

Je n’ai pas de fenêtres, donc je ne peux pas tester la commande ci-dessus, vous devrez peut-être supprimer l’ call ou le remplacer par simplement sed . Une autre alternative que vous pouvez essayer est:

 Ssortingng[] cmdArray = {"cmd", "/c", "sed 's/YourRegex/YourReplaceStr/' inputfile > output"}; Process runCmd = Runtime.getRuntime().exec(cmdArray); 

Dans ce lien, vous trouverez un exemple de répertoire exécuté à partir de Java que vous pourrez adapter pour utiliser sed.