2009-04-10 7 views
26

J'ai un fichier XML contenant une (ou plusieurs) paire clé/valeur. Pour chacune de ces paires, je veux extraire la valeur qui est une valeur hexadécimale à deux octets.Comment extraire une sous-chaîne d'un .NET RegEx?

Ainsi, le XML contient cet extrait:

<key>LibID</key><val>A67A</val> 

Ce que je peux correspondre à l'aide de l'expression suivante, avec l'ID entre parenthèses.

Match match = Regex.Match(content, @"<key>LibID</key><val>([a-fA-F0-9]{4})</val>"); 

if (match.Success) 
{ 
    Console.WriteLine("Found Match for {0}\n", match.Value); 
    Console.WriteLine("ID was {0}\n", "Help me SO!"); 
} 

Comment puis-je modifier la dernière partie afin qu'elle renvoie l'ID de la correspondance?

À la votre!

Répondre

48

Je pense que vous voulez

match.Groups[1].Value 

(Comme Darlie-O indique dans les commentaires, il est le groupe 1 parce que le groupe 0 est toujours le match.)

programme de test, mais complet:

using System; 
using System.Text.RegularExpressions; 

class Program 
{ 
    static void Main() 
    { 
    Regex regex = new Regex("<key>LibID</key><val>([a-fA-F0-9]{4})</val>"); 
    Match match = regex.Match("Before<key>LibID</key><val>A67A</val>After"); 

    if (match.Success) 
    { 
     Console.WriteLine("Found Match for {0}", match.Value); 
     Console.WriteLine("ID was {0}", match.Groups[1].Value); 
    }  
    } 
} 

sortie:

Found Match for <key>LibID</key><val>A67A</val> 
ID was A67A 
+2

Battez-moi. Vous utilisez déjà un match groupé sur Andrew, vous pouvez donc facilement extraire la valeur groupée. Oh, et pour mémoire, l'index 0 contient la chaîne entière, c'est pourquoi vous vérifiez l'index 1. –

+0

Super merci. Je savais qu'il était là quelque part, je ne savais pas où :) –

+0

@ Dillie-O: Bon point, je l'ai inclus dans un montage. –

1

Ajouter un grouping construct à votre expression ...

<key>(?<id>LibID)</key><val>([a-fA-F0-9]{4})</val> 

qui captera l'ID. Mais, vous devez mettre le format correct dans votre expression pour l'ID réel, car votre expression régulière ne capturera "LibID" littéralement.

+1

Je pense par "ID" Andrew signifie le contenu de l'élément , pas l'élément . –

Questions connexes