2009-10-21 6 views
1

est ici la source de données, les lignes stockées dans un fichier txt:Comment écrire une regex avec la correspondance de groupe?

servers[i]=["name1", type1, location3]; 
servers[i]=["name2", type2, location3]; 
servers[i]=["name3", type1, location7]; 

Voici mon code:

string servers = File.ReadAllText("servers.txt"); 
    string pattern = "^servers[i]=[\"(?<name>.*)\", (.*), (?<location>.*)];$"; 

    Regex reg = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline); 
    Match m; 

    for (m = reg.Match(servers); m.Success; m = m.NextMatch()) { 
     string name = m.Groups["name"].Value; 
     string location = m.Groups["location"].Value;     
    } 

Aucune ligne ne sont correspondent. Qu'est-ce que je fais mal?

Répondre

0

Je ne sais pas si C# regex ce sont les mêmes que Perl, mais si oui, vous voulez probablement échapper aux personnages [ et ]. En outre, il y a des caractères supplémentaires là-dedans. Essayez ceci:

string pattern = "^servers\[i\]=\[\"(?<name>.*)\", (.*), (?<location>.*)\];$"; 

Edité pour ajouter: Après s'être demandé pourquoi ma réponse a été downvoted et puis regarder la réponse de Val, je me suis aperçu que les « caractères supplémentaires », il y avait pour une raison. Ils sont ce que perl appelle des "buffers de capture nommés", que je n'ai jamais utilisés mais le fragment de code original. J'ai mis à jour ma réponse pour les inclure.

+0

Cela faisait partie de cela, correspondait à une ligne après ces changements. Enlever le^et $ s'est occupé du reste. Merci! –

0

essayer cette

string pattern = "servers[i]=[\"(?<name>.*)\", (.*), (?<location>.*)];$"; 
2

Si vous ne vous souciez de rien d'autre que le nom du serveur et l'emplacement, vous n'avez pas besoin de spécifier le reste de l'entrée dans votre regex. Cela vous évite d'avoir à échapper aux crochets, comme Graeme le signale correctement. Essayez quelque chose comme:

string pattern = "\"(?<name>.+)\".+\s(?<location>[^ ]+)];$" 

C'est

\"   = quote mark, 
(?<name>  = start capture group 'name', 
.+   = match one or more chars (could use \w+ here for 1+ word chars) 
)   = end the capture group 
\"   = ending quote mark 
.+\s   = one or more chars, ending with a space 
(?<location> = start capture group 'location', 
[^ ]+  = one or more non-space chars 
)   = end the capture group 
];$   = immediately followed by ]; and end of string 

J'ai testé cela en utilisant vos données d'échantillons dans Rad sans Regex Designer du logiciel, qui utilise le moteur de regex .NET.

Questions connexes