2017-05-23 3 views
1

J'ai un ensemble de valeurs octales disons (0177-0377). chaque fois que ces valeurs je trouve dans la chaîne, doivent remplacer avec.Java - Regex pour remplacer la valeur Octal dans la chaîne

String a= "sccce¼»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕerferferfer"; 
    for (int i = 0177; i<= 0377 ; i++) 
    { 
     char x= (char) i; 
     a= a.replaceAll(Character.toString(x), "?"); 
    } 
    System.out.print(a); 

mais cela semble bien quand nous avons petit fichier, mais je dois effectuer cette opération dans le fichier 1TB. Comment pouvons-nous utiliser regex pour réaliser cette tâche?

+1

Les littéraux « 177 » et « 377 » ne sont pas des littéraux octaux - ce sont des littéraux décimaux. Si vous voulez des valeurs octales, utilisez 0177 et 0377. On ne sait pas non plus pourquoi vous pensez que les expressions régulières sont la solution ici ... –

+0

Quelle serait la solution optimale pour ce scénario? – Ajay

+0

Eh bien je voudrais utiliser un 'Reader', lire un morceau de texte à la fois (dans un tableau char), puis itérer sur le tableau char, remplacer toutes les valeurs dans cette gamme, puis écrire ce morceau sur un' Writer'. Répétez jusqu'à ce que vous avez tout lu dans le fichier. –

Répondre

1

Vous pouvez utiliser cette regex [^\p{ASCII}], qui remplacent tous les non ASCII caractères:

a.replaceAll("[^\\p{ASCII}]", "?") 

Sortie:

sccce????????????????????????????erferferfer 

Vous devez trouver la représentation du caractère octal dans Hexadécimal, à partir du link0177 est représenté par \x7F et 0377 est représenté par FF

Pour votre cas, vous pouvez utiliser:

a.replaceAll("[\\x7F-\\xFF]", "?") 

Ideone demo

+0

Je pense, je suis à la recherche de la même approche. Peut-on expliquer quelle est exactement la fonctionnalité de '[\ \ \ p {ASCII}]'? – Ajay

+0

@Ajay cela remplacera tous les caractères non ASCII –

+0

Est-il possible de remplacer un ensemble spécifique de valeurs octales. – Ajay

1

Vous ne voulez pas faire cela pour le fichier entier en une seule fois - vous avez besoin d'une diffusion en continu approche. Je ferais quelque chose comme ceci:

// TODO: Rename to something more appropriate 
public static void replaceInvalidCharacters(Reader reader, Writer writer) { 
    char[] buffer = new char[16384]; // Adjust if you want 
    int charsRead; 
    while ((charsRead = reader.read(buffer)) > 0) { 
     for (int i = 0; i < charsRead; i++) { 
      if (buffer[i] >= 0177 && buffer[i] <= 0377) { 
       buffer[i] = '?'; 
      } 
     } 
     writer.write(buffer); 
    } 
} 

donc vous devriez ouvrir un lecteur (avec l'encodage approprié) pour le fichier en cours, un écrivain (avec l'encodage approprié) pour le fichier de sortie, puis appelez la méthode au dessus. Il va lire un morceau de données à la fois, remplacer tous les caractères "mauvais" dans le morceau, puis écrire le morceau à l'écrivain.

Pas besoin d'expressions régulières.

Notez qu'il ya beaucoup de caractères non-ASCII en dehors de cette plage bien - si vous voulez vraiment supprimer tous les non-ASCII, vous devriez essentiellement veulent

if (buffer[i] > 126) // Or 127; what do you want to do with U+007F?