-1

我想使用正则表达式来获取<AirlineCode></AirlineCode>标签之间的航空公司代码。

我只想要<AirlineCode>标签中的<Flight>标签值。外面有更多<AirlineCode>标签,我不想要它们的航空公司价值。

我尝试使用下面的正则表达式,但无论提到的位置考虑如何,它都会给我所有航空公司代码。请帮忙。

        var regex = new Regex(@"<AirlineCode>(.*?)</AirlineCode>", RegexOptions.IgnoreCase);

        Match m = regex.Match("<PNRViewRS><AirGroup><Flight CnxxIndicator=\"N\"><Arrival></Arrival><Carrier><AirlineCode>DL</AirlineCode></Carrier></Flight><Flight CnxxIndicator=\"N\"><Arrival></Arrival><Carrier><AirlineCode>AA</AirlineCode></Carrier></Flight></AirGroup></PNRViewRS>");
        int matchCount = 0;
        while (m.Success)
        {
            Console.WriteLine("Match" + (++matchCount));
            for (int i = 1; i <= 2; i++)
            {
                Group g = m.Groups[i];
                //do stuff...
            }
            m = m.NextMatch();
        }
4

1 回答 1

2

通常,尝试使用正则表达式解析 XML 是个坏主意。原因是正则表达式表达能力不足,即使有反向引用等。评论中链接的问题值得一读,以了解为什么这通常是一个坏主意。

也就是说,如果您确定文件的格式,并且您也愿意进行一些非正则表达式解析,那么您就可以成功。

在您的情况下,您基本上有:

<Flight>
    <AirlineCode>
    </AirlineCode>
<Flight>
<AirlineCode>
</AirlineCode>
<Flight>
    <AirlineCode>
    </AirlineCode>
<Flight>

并且您想要<AirlineCode>标签中出现的所有<Flight>标签。

解决此问题的方法是<Flight>使用一个正则表达式提取标签及其内容,然后使用另一个正则表达式<AirlineCode>从这些提取的标签中提取<Flight>标签。不要尝试在单个正则表达式中执行此操作。你不会成功。

如果您的数据真的那么简单,那么这将起作用。我不会说我推荐这种方法。有太多事情可能出错。数据格式有一种令人痛苦的变化趋势,如果格式发生一点点变化,那么脆弱的正则表达式解决方案很可能会崩溃。XML 解析器解决方案将更加健壮。

于 2013-04-17T20:31:52.827 回答