代码之家  ›  专栏  ›  技术社区  ›  Andrew Grant

如何从.NET正则表达式中提取子字符串?

  •  32
  • Andrew Grant  · 技术社区  · 16 年前

    我有一个包含一个(或多个)键/值对的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 回复  |  直到 16 年前
        1
  •  57
  •   Jon Skeet    16 年前

    我想你想要

    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
    
        2
  •  1
  •   JP Alioto    16 年前

    添加一个 grouping construct 你的表情…

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

    这将捕获ID。但是,您需要在表达式中为实际ID设置正确的格式,因为您的regex只捕获少量的“libid”。