2012-07-10 4 views
0

Je suis en train d'analyser un fichier texte ligne par ligne, comment puis-je créer plusieurs collections de correspondance et tenter plusieurs correspondances sur chaque ligne traitée?Multiple matchcollections par ligne

Actuellement, je suis en train ceci:

while ((line = reader.ReadLine()) != null) { 

string match1 = @"\s+([^)]*):entry:\s+cust\(([^)]*)\)\s+custno\(([^)]*)\)\s+id\(([^)]*)\)\s+name\(([^)]*)\)"; 
string match2 = @"group\(([^)]*)\)\s+spec\(([^)]*)\)\s+goodtill([^)]*)$"; 
string match3 = @"returns\(([^)]*)\)"; 

MatchCollection matches = Regex.Matches(line, match1); 
MatchCollection matches2 = Regex.Matches(line, match2); 
MatchCollection matches3 = Regex.Matches(line, match3); 




foreach (Match matchr1 in matches) 
{ 

    line1.Add("Date:" + matchr1.Groups[1].Value + ", Customer:" 
        + matchr1.Groups[2].Value + ", CustID:" + matchr1.Groups[3].Value + 
        ", ID:" + matchr1.Groups[4].Value + ", Name:" + matchr1.Groups[5].Value); 
} 

foreach (Match matchr2 in matches2) 
{ 

    line2.Add("Group:" + matchr2.Groups[1].Value + ", Spec:" + matchr2.Groups[2].Value + ", Good Till:" + matchr2.Groups[3].Value); 
} 

foreach (Match matchr3 in matches3) 
{ 

    line3.Add("Returns: " + matchr3.Groups[1].Value); 
} 

} 

Après le traitement du fichier et d'essayer de compter les tailles ArrayList:

MessageBox.Show(line1.Count + " " + line2.Count + " " + line3.Count); 

je reçois 5000 0 0. Pourquoi mes 2 derniers ArrayLists vide? Il devrait y avoir beaucoup de matches, les regex sont confirmés corrects.

données Exemple:

LUCIE:496 27AUG120755:entry: cust(GUIR) custno(j010705) id(293746) name(mike) 
LUCIE:496 27AUG120755:  group(0000) spec(03) stripdn(N) pre228(N)  goodtill 01/MAR/08 
LUCIE:496 27AUG120755:getprotcode given (m000029374603MAR08), returns (TUUjFDEO) 
+2

Parce que les deuxième et troisième expressions régulières ne correspondent pas du tout? Nous ne pouvons pas vous donner une réponse définitive sans savoir à quoi ressemblent vos lignes. Avez-vous même regardé le contenu du lecteur et les collections pour vérifier que vous obtenez les résultats attendus? Pourquoi utilisez-vous ArrayLists? –

+0

Assurez-vous que la ligne contient toujours du contenu après le premier appel à Regex.Matches. Une autre chose que j'ai remarquée sur l'API est que "La collection ne comprend que des correspondances réussies et se termine à la première correspondance infructueuse." La méthode pourrait-elle se terminer plus tôt? Pouvez-vous nous donner le fichier avec lequel vous testez? .... ref: http://msdn.microsoft.com/en-us/library/b9712a7w.aspx – Tom

+0

@Jeff a confirmé regex dans regexbuddy avec des lignes associées. Le fichier contient des données confidentielles du client, je posterai des données d'échantillon. –

Répondre

0

Si vous allez être littérale sur les données, vous devez exiger que les composants manquants dans les 2e et 3e de regex. Ou, si sa variable, il suffit d'ajouter un peu de remplissage

group 
\(
    ([^)]*) 
\) 
\s+ spec 
\(
    ([^)]*) 
\) 
    # missing : 
    #  \s+ stripdn 
    #  \(
    #  ([^)]*) 
    #  \) 
    #  \s+ pre228 
    #  \(
    #  ([^)]*) 
    #  \) 

\s+ goodtill 
([^)]*) 
$ 


returns 
    # missing a \s* here 
\(
    ([^)]*) 
\) 


LUCIE:496 27AUG120755:entry: cust(GUIR) custno(j010705) id(293746) name(mike) 
LUCIE:496 27AUG120755:  group(0000) spec(03) stripdn(N) pre228(N)  goodtill 01/MAR/08 
LUCIE:496 27AUG120755:getprotcode given (m000029374603MAR08), returns (TUUjFDEO)