仅使用Regex Look-Behinds返回第一场比赛

时间:2013-04-22 16:55:07

标签: c# xml regex lookbehind non-greedy

给出以下XML文档:

<root>
    <myGoodSection 
          some="attr" 
          another="attr" 
      />
    <myBadSection yet="anotherattr" />
</root>

如何使用正则表达式返回第一个/>?到目前为止,我已经能够使用以下表达式非常接近:

(?ims)(?<=<myGoodSection.*?)/>

但是,这将匹配第一次出现/>后的<myGoodSection的每个实例。我也尝试将它与负面的后视相结合,努力使表达非贪婪,但它似乎没有任何影响:

(?ims)(?<=<myGoodSection.*?)(?<!/>)/>

修改

我正在使用基于C#构建的工具来处理正则表达式替换。如果我直接使用System.Text.RegularExpressions,我无法控制可以使用或不使用的匹配项数量。我在这里引用C#来阐明我正在使用的引擎支持的功能。

是的,我知道作为一般惯例,我不应该使用RegEx来解析XML。我们只是规定,鉴于我目前的范围,要求和约束条件,它是一个完全可以接受的解决方案(实际上有一种方法可以实现它)。

2 个答案:

答案 0 :(得分:1)

我能够通过将.替换为\b[^>]来完成此操作,以便我的最终表达式成为:

(?ims)(?<=<myGoodSection\b[^>]*?)/>

只有前缀在任何地方都不包含/>时才会匹配结束>,这将排除第一次匹配后的所有代码。

答案 1 :(得分:0)

首先,您不应该使用Regex来解析XML。

使用该aisde,您只能使用Regex.Match()返回第一场比赛。

另外,如果你的正则表达式只是返回太多,你可以使用非贪婪的选择,如下所示:

(?ims)(?<=<myGoodSection.*?)/>

请注意?之后的*