正则表达式帮助 - 必须是可能的,我只是无法让它工作

时间:2011-07-26 06:53:29

标签: regex

编辑 - 由于XML角度似乎让人们偏离正轨,我已经改变了我正在搜索的字符串。我知道如何使用诸如JAXB和Xpath / XQuery之类的XML技术,我想知道是否以及如何使用REGEX来实现这一点。

这让我很生气。我已经尝试了很多东西,并且已经接近我想要的东西,但是无法指出它。

作为一个愚蠢的例子......

来自此字符串

  

ITEM id = 1 a = 1 want = YES x = 24 ITEM id = 2 a = 1 b = 2 wanted = NO y = 25 ITEM id = 3 c = 3 wanted = YES x = 25 z = 26

我想得到每个想要的项目的ID = YES。因此,在这种情况下的结果将是1和3。

根据我的尝试,我遇到的问题是阻止我的正则表达式超出当前项目,因为项目id = 2它正在使用项目3中的wanted = YES。我尝试了几个前瞻(和背后)但是无法得到我想要的东西。

我还应该注意到我希望将其作为单个正则表达式。我知道我可以做一些事情,比如分出每个项目,然后处理想要=是,但我想知道是否可以使用单个正则表达式。我从c#(.NET)调用这个正则表达式,所以正则表达式可以使用.NET正则表达式允许的更花哨的lookbehinds,但是如果可能的话我会更喜欢它,以便它更便于携带。

提前致谢(看起来应该很简单,但让我很生气),

史蒂夫

3 个答案:

答案 0 :(得分:5)

您不应该使用正则表达式来解析XML。这可以使用简单的XPath实现。根据您使用的语言,有各种支持XPath的XML库。

您的示例XML无效,但这是一个C#示例(使用LINQ-to-XML),其中包含有效的XML:

string s = "<root><item><id>1</id><x><wanted>YES</wanted></x></item><item><id>2</id><x><wanted>NO</wanted></x></item><item><id>3</id><x><wanted>YES</wanted></x></item></root>";
var xml = XElement.Parse(s);

var items = xml.XPathSelectElements("//item[descendant::wanted='YES']");

foreach (var item in items)
    Console.WriteLine((int)item.Element("id"));

答案 1 :(得分:1)

这个正则表达式应该可行(对'想要'使用负向前瞻):

string s = "ITEM id=1 a=1 wanted=YES x=24 ITEM id=2 a=1 b=2 wanted=NO y=25 ITEM id=3 c=3 wanted=YES x=25 z=26";

foreach (Match match in Regex.Matches(s, "id=([0-9]+)(.(?!wanted))*.wanted=yes", RegexOptions.IgnoreCase))
    Console.WriteLine(match.Groups[1].Value);

这假设id总是在想要的之前。

答案 2 :(得分:0)

你不能用正则表达式做到这一点。 XML不是regular language

您必须使用专为解析XML而设计的内容。此页面上的C#示例可能会对您有所帮助:http://msdn.microsoft.com/en-us/library/cc189056(v=vs.95).aspx#Y586

相关问题