2009-02-07 6 views
2

J'écris un programme qui a besoin de rechercher un document de texte LARGE pour une grande collection de mots. Les mots sont tous des noms de fichiers, avec des caractères de soulignement (par exemple, nom_fichier). Je sais comment ouvrir et itérer à travers un document texte, mais je suis curieux de savoir si je devrais utiliser Regex pour rechercher ces noms, et si oui, quel genre de reg. ex. séquence devrais-je utiliser? J'ai essayéC# expressions régulières - mots entiers correspondants?

 
Regex r = new Regex("?this\_file\_name"); 

mais j'obtiens une erreur argument invalide à chaque fois.

Répondre

3

Il serait utile de voir un échantillon du texte source. mais peut-être cela aide

var doc = @"asdfsdafjkj;lkjsadf asddf jsadf asdfj;lksdajf 
sdafjkl;sjdfaas sadfj;lksadf sadf jsdaf jf sda sdaf asdf sad 
jasfd sdf sadf sadf sdajlk;asdf 
this_file_name asdfsadf asdf asdf asdf 
asdf sadf asdfj asdf sdaf sadfsadf 
sadf asdf this_file_name asdf asdf "; 

var reg = new Regex("this_file_name", RegexOptions.IgnoreCase | RegexOptions.Multiline); 
var matches = reg.Matches(doc); 
+0

Le modificateur multiligne n'est pas nécessaire. –

+0

@Alan M, pourquoi pas? – bendewey

+0

Comme Alan l'a souligné, le 'RegexOptions.Multiline' n'est pas nécessaire. Lisez sa documentation. Cela ne fait une différence que si vous utilisez '^' et/ou '$'. – Timwi

0

Si je comprends bien votre problème, je pense qu'une expression régulière est le mauvais outil pour le travail. Je suppose que vos noms de fichiers sont séparés par une sorte de délimiteur (comme des virgules ou de nouvelles lignes).

Si c'est le cas, utilisez String.Split pour placer tous les noms de fichiers dans un tableau, trier le tableau par ordre alphabétique, puis effectuer une recherche binaire sur le tableau trié pour chaque élément de la "collection" que vous avez mentionné. Je suis à peu près sûr que c'est le moyen le plus efficace en termes de calcul pour effectuer la tâche. Lorsque vous dites "LARGE" fichiers texte, pensez à leur taille par rapport aux machines sur lesquelles ce programme sera exécuté. Un fichier texte de 1 Mo peut sembler volumineux, mais il s'intégrera facilement dans la mémoire d'une machine avec 2 Go de RAM. Si le fichier est considérablement plus grand par rapport à la mémoire de vos machines clientes, lisez le fichier en morceaux à la fois. C'est ce qu'on appelle la mise en mémoire tampon.

1

Peut-être casser votre document en jetons en divisant d'abord l'espace ou les caractères non-mot?

Après, je pense une expression rationnelle qui pourrait fonctionner pour vous ressemblerait à quelque chose comme ceci:

Regex r = new Regex(@"([\w_]+)");

Questions connexes