Extracting text fields from  tags in an HTML message What i'm doing

I have a string with html information like this:

&lt;p&gt; &lt;span class="fieldText" fieldId="field-4"&gt;Some text&lt;/span&gt; this is a test&lt;/p&gt;


My goal in the method is to create a dictionary with this value:

**key**     **value**
field-4    Some text


This is the code that i'm using to accomplish my task:

public static Dictionary&lt;int,String&gt; getFields(String mensaje) 
    {
        Dictionary&lt;int,String&gt; fields = new Dictionary&lt;int,string&gt;();
        Match m = Regex.Match(mensaje, @"^(.*?&lt;span .*?&gt;(.*?)&lt;/span&gt;.*?)+$", RegexOptions.Singleline);
        for (int i = 0; i &lt; m.Groups[2].Captures.Count; i++)
        {
            String value = m.Groups[1].Captures[i].Value;
            Match m2 = Regex.Match(value, "^(.*?fieldId=.*?\"(.*?)\"&gt;.*?)+$", RegexOptions.Singleline);
            String fieldId = m2.Groups[2].Captures[0].Value;
            fieldId = fieldId.Replace("field-", String.Empty);
            fields.Add(int.Parse(fieldId),m.Groups[2].Captures[i].Value);
        }

        return fields;
    }


How can i improve my code?
I know this is Code Review not Rewrite My Code, however I would suggest using a third-party Html parser (like the Html Agility Pack for example) over regular expressions if that's an option. 

I realize you're doing very trivial parsing here, but from my personal experiences regular expressions grow to unmaintainable status quicker than anything in software development.

If you were to use a Html parser, you could do something like this:

string htmlToParse = "&lt;p&gt;&lt;span class=\"fieldText\" fieldId=\"field-4\"&gt;Some text&lt;/span&gt; this is a test&lt;/p&gt;&lt;p&gt;&lt;span class=\"fieldText\" fieldId=\"field-5\"&gt;Some more text&lt;/span&gt; this is another test&lt;/p&gt;";
const string ElementToParse = "span";
const string IdField = "FieldId";

HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(htmlToParse);

int fieldId = default( int );

Dictionary&lt;int,string&gt; fieldValuesTable = 
(
    from
        htmlNode in htmlDocument.DocumentNode.DescendantNodes()
    where
        htmlNode.Name.Equals( ElementToParse, StringComparison.InvariantCultureIgnoreCase )
        &amp;&amp;
        htmlNode.Attributes.Contains( IdField )
    let
        id = htmlNode.Attributes[ IdField ].Value
    where
        Int32.TryParse( id.Substring( id.IndexOf( "-" ) + 1 ), out fieldId ) // this is stil not ideal,
    select
        new { Id = fieldId, Text = htmlNode.InnerText }
).ToDictionary( f =&gt; f.Id, f =&gt; f.Text );


You get the output:

4 : Some text
5 : Some more text


IMHO, it's much cleaner and maintainable.