2010-10-04 3 views
1

J'ai un énorme fichier, et je veux tout souffler dans le fichier, sauf pour ce qui correspond à mon regex. Je sais que je peux obtenir des correspondances et simplement en extraire, mais je veux garder mon dossier et me débarrasser de tout le reste.Correspondant à tout sauf une expression rationnelle spécifiée

Voici mon regex:

"Id":\d+ 

Comment dire que je "correspondre tout sauf "Id":\d+". Quelque chose du genre

!("Id":\d+) (pseudo regex)? Je veux l'utiliser avec une fonction Regex Replace. En anglais je veux dire:

Obtenez tout le texte qui n'est pas "Id":\d+ et remplacez-le par chaîne vide.

+0

Quand vous dites jeter tout le reste, voulez-vous dire garder les lignes contenant l'expression régulière ou simplement garder les chaînes qui correspondent à l'expression régulière? – Rohith

+1

Voulez-vous dire que vous voulez une regex qui correspond à tout, sauf ce que votre regex correspond? –

+1

votre question ressemble à un piège mental logique. ;-) – splash

Répondre

1

Désolé, mais je ne comprends pas votre problème. Ne devrait-il pas être facile de grep les matches dans un nouveau fichier?

Yoo a écrit:

Obtenir tous les textes qui ne sont pas "Id": \ d + et le remplacer par et chaîne vide.

Un équivalent logique serait:

Get tout le texte qui correspond à "Id":\d+ et placez-le dans un nouveau fichier. Remplacez l'ancien fichier par le nouveau.

+1

Micah mentionne dans sa question qu'il ne veut pas faire ça – Rohith

+0

Mais il a dit "Je veux tout emporter dans le fichier sauf ce qui correspond à mon regex", donc je le comprends comme il veut toutes les lignes correspond à son regex. Je trouve cela un peu confus. – splash

1

bien, à l'opposé de \d est \D dans regexes perl-ish. Est-ce que .net a quelque chose de similaire?

+0

Oui, .NET le supporte. –

0

Je n'ai pas utiliser .net avant, mais après travaux en java

System.out.println("abcd Id:12351abcdf".replaceAll(".*(Id:\\d+).*","$1")); 

produit sortie

Id:12351 

Bien que dans le vrai sens, il ne marche pas correspondre aux critères de tout except Id: \ d +, mais il fait le travail

+0

Essayez de voir ce qui se passe quand vous avez deux occurrences de 'Id: 234' dans votre chaîne ... –

2

Essayez ceci:

string path = @"c:\temp.txt"; // your file here 
string pattern = @".*?(Id:\d+\s?).*?|.+"; 
Regex rx = new Regex(pattern); 

var lines = File.ReadAllLines(path); 
using (var writer = File.CreateText(path)) 
{ 
    foreach (string line in lines) 
    { 
     string result = rx.Replace(line, "$1"); 
     if (result == "") 
      continue; 

     writer.WriteLine(result); 
    } 
} 

Le motif conservera les espaces entre plusieurs occurrences Id: Number sur la même ligne. Si vous n'en avez qu'un Id par ligne, vous pouvez supprimer le \s? du motif. File.CreateText va ouvrir et écraser votre fichier existant. Si un remplacement entraîne une chaîne vide, il sera ignoré. Sinon, le résultat sera écrit dans le fichier.

La première partie du modèle correspond à Id: numéro occurrences. Il comprend une alternance pour .+ pour faire correspondre les lignes où Id: numéro n'apparaît pas.Le remplacement utilise $1 pour remplacer la correspondance avec le contenu du premier groupe, qui est la partie réelle Id: (Id:\d+\s?).

Questions connexes