给出以下XML文档:
<root>
<myGoodSection
some="attr"
another="attr"
/>
<myBadSection yet="anotherattr" />
</root>
如何使用正则表达式返回第一个/>
?到目前为止,我已经能够使用以下表达式非常接近:
(?ims)(?<=<myGoodSection.*?)/>
但是,这将匹配第一次出现/>
后的<myGoodSection
的每个实例。我也尝试将它与负面的后视相结合,努力使表达非贪婪,但它似乎没有任何影响:
(?ims)(?<=<myGoodSection.*?)(?<!/>)/>
修改
我正在使用基于C#构建的工具来处理正则表达式替换。如果我直接使用System.Text.RegularExpressions
,我无法控制可以使用或不使用的匹配项数量。我在这里引用C#来阐明我正在使用的引擎支持的功能。
是的,我知道作为一般惯例,我不应该使用RegEx来解析XML。我们只是规定,鉴于我目前的范围,要求和约束条件,它是一个完全可以接受的解决方案(实际上有一种方法可以实现它)。
答案 0 :(得分:1)
我能够通过将.
替换为\b[^>]
来完成此操作,以便我的最终表达式成为:
(?ims)(?<=<myGoodSection\b[^>]*?)/>
只有前缀在任何地方都不包含/>
时才会匹配结束>
,这将排除第一次匹配后的所有代码。
答案 1 :(得分:0)
首先,您不应该使用Regex来解析XML。
使用该aisde,您只能使用Regex.Match()返回第一场比赛。
另外,如果你的正则表达式只是返回太多,你可以使用非贪婪的选择,如下所示:
(?ims)(?<=<myGoodSection.*?)/>
请注意?
之后的*
。