tags:

views:

242

answers:

2

I have an XML file containing one (or more) key/value pairs. For each of these pairs I want to extract the value which is a two-byte hex value.

So the XML contains this snippet:

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

Which I can match using the following expression, with the ID in parenthesis.

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!");
}

How can I change the last part so it returns the ID from the match?

Cheers!

+4  A: 

I think you want

match.Groups[1].Value

(As Dillie-O points out in the comments, it's group 1 because group 0 is always the whole match.)

Short but complete test program:

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);
    }      
  }
}

Output:

Found Match for <key>LibID</key><val>A67A</val>
ID was A67A
Jon Skeet
Beat me to it. You're already using a grouped match there Andrew, so you can easily extract the grouped value. Oh, and for the record, index 0 contains the entire string, that's why you check index 1.
Dillie-O
Super thanks. I knew it was in there somewhere, I just didn't know where :)
Andrew Grant
@Dillie-O: Good point, I've included that in an edit.
Jon Skeet
A: 

Add a grouping construct to your expression ...

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

That will capture the ID. But, you need to put the correct format in your expression for the actual ID, because your regex will only capture "LibID" litterally.

JP Alioto
I think by "ID" Andrew means the contents of the <val> element, not the <key> element.
Alan Moore