Поиск значений в определенных тегах с помощью регулярных выражений - PullRequest
0 голосов
/ 22 января 2009

У меня есть пример строки:

<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 ]

3 голосов
/ 22 января 2009

Вы хотите использовать совпадения, а не совпадения, чтобы получить все совпадения, например:

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 голосов
/ 22 января 2009

Я настоятельно рекомендую использовать 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()));
0 голосов
/ 22 января 2009

Regex часто голоден, поэтому он будет соответствовать от первого тега до последнего тега. Если ваш XML правильно сформирован, вы можете изменить его на регулярное выражение, например:

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

Для поиска чего-либо, кроме <</p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...