如何从 .NET RegEx 中提取子字符串?

52

我有一个包含一个或多个键/值对的XML文件。对于这些键值对中的每一个,我想要提取一个两字节十六进制值。

因此,XML包含以下片段:

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

我可以使用以下表达式进行匹配,括号里面是ID。
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!");
}

我该如何更改最后一部分以返回匹配的ID?

2个回答

79
我想你想要的是
match.Groups[1].Value

(正如Dillie-O在评论中指出的那样,它是第1组,因为第0组始终是整个匹配。)

简短但完整的测试程序:

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

输出:

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

4
你抢先了。安德鲁,你已经在使用分组匹配了,所以可以轻松地提取分组值。顺便说一下,索引0包含整个字符串,这就是为什么要检查索引1的原因。 - Dillie-O
非常感谢。我知道它在那里,只是不知道在哪里 :) - Andrew Grant
嗯,不太确定为什么,但我的匹配组中只包含一个值,索引为0,而这正是我需要的。无论如何,谢谢。 - undefined
@CularBytes:如果我们不知道你使用的模式或者你要匹配的内容,那么我们无法向你解释这种行为。如果你对此感兴趣,可以发布一个带有 [mcve] 的新问题来了解更多信息。 - undefined

3

在您的表达式中添加分组结构...

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

这将捕获ID。但是,您需要在实际ID的表达式中放入正确的格式,因为您的正则表达式只会字面上捕获“LibID”。


2
我认为安德鲁所说的“ID”,是指<val>元素的内容,而不是<key>元素。 - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接