代码之家  ›  专栏  ›  技术社区  ›  Chris James

使用regex在某些标记中查找值

  •  0
  • Chris James  · 技术社区  · 16 年前

    我有一个示例字符串:

    <num>1.</num> <Ref>véase anomalía de Ebstein</Ref> <num>2.</num> <Ref>-> vascularización</Ref>
    

    我想制作一个逗号分隔的字符串,其值位于ref标记内。

    我尝试了以下方法:

                Regex r = new Regex("<ref>(?<match>.*?)</ref>");
                Match m = r.Match(csv[4].ToLower());
                if (m.Groups.Count > 0)
                {
                    if (m.Groups["match"].Captures.Count > 0)
                    {
                        foreach (Capture c in m.Groups["match"].Captures)
                        {
                            child.InnerText += c.Value + ", ";       
                        }
                        child.InnerText = child.InnerText.Substring(0, child.InnerText.Length - 2).Replace("-> ", "");
                    }
                }
    

    但这似乎只能在第一个ref标记中找到值。

    我哪里出错了?

    3 回复  |  直到 16 年前
        1
  •  3
  •   Wolfwyrd    16 年前

    您希望使用匹配项而不是匹配项来获取发生的所有匹配项,例如:

    Regex r = new Regex("<ref>(?<match>.*?)</ref>");
    foreach (Match m in r.Matches(csv[4]))
    {
        if (m.Groups.Count > 0)
        {
            if (m.Groups["match"].Captures.Count > 0)
            {
                foreach (Capture c in m.Groups["match"].Captures)
                {
                    child.InnerText += c.Value + ", ";
                }
                child.InnerText = child.InnerText.Substring(0, child.InnerText.Length - 2).Replace("-> ", "");
            }
        }
    }
    
        2
  •  2
  •   Robert Rossney    16 年前

    我强烈建议使用XPath而不是正则表达式来搜索XML文档。

    string xml = @"<test>
        <num>1.</num> <Ref>véase anomalía de Ebstein</Ref> <num>2.</num> <Ref>-> vascularización</Ref>
    </test>";
    
    XmlDocument d = new XmlDocument();
    d.LoadXml(xml);
    
    var list = from XmlNode n in d.SelectNodes("//Ref") select n.InnerText;
    Console.WriteLine(String.Join(", ", list.ToArray()));
    
        3
  •  0
  •   cjk    16 年前

    regex通常很饿,因此它将从第一个标记匹配到最后一个标记。如果您的XML格式良好,您可以将其更改为regex,如下所示:

    Regex r = new Regex("<ref>(?<match>[^<]*?)</ref>");
    

    搜索除a<以外的任何内容