我有一个包含以下文本的文本文件(示例嵌套,如果,我知道它没有意义。):
<if string=%fld.plaintiffsSex eql=Male>
<set field=plaintiffPronoun1 value=[his]>
<set field=plaintiffPronoun2 value=[he]>
<set field=plaintiffPronoun3 value=[him]>
<else>
<if string=%fld.plaintiffsSex eql=Female>
<set field=plaintiffPronoun1 value=[her]>
<set field=plaintiffPronoun2 value=[she]>
<set field=plaintiffPronoun3 value=[her]>
</if>
</if>
不幸的是,我必须使用Regex来获取最内层的if语句。我目前有以下正则表达式,但它没有像我期望的那样工作。正则表达式语句基本上必须是任何不包含<if
的if语句。
// first if that doesn't contain <if to </if>
[\s\S]*(<if[\s\S]*?(?!.*<if)[\s\S]*?<\/if>)
我想捕捉的只是:
<if string=%fld.plaintiffsSex eql=Female>
<set field=plaintiffPronoun1 value=[her]>
<set field=plaintiffPronoun2 value=[she]>
<set field=plaintiffPronoun3 value=[her]>
</if>
目前,它得到了我想要的组[1],但我只想让它成为整场比赛。
请不要使用其他方法/扩展来解析XML或文本。
修改
我尝试过两次复制和粘贴相同的东西,但是当它应该是两个匹配时,它仍然会出现一个匹配。
编辑2:
我在C#工作。
答案 0 :(得分:2)
(<if(?:(?!<if).)*?<\/if>)
https://regex101.com/r/yG2cU4/1
(
- 开始捕获组<if
- 完全匹配<if
(?:(?!<if).)*?
- 匹配任何未跟随字面<if
的单个字符的任意数字,并且懒惰地执行,这意味着它将匹配仍然允许正则表达式匹配的最小长度。
(?:
- 开始一个非捕获组(一个组,但未捕获该匹配)(?!<if).
- 负面预测,基本上断言角色后面的内容不是<if
。)*?
- 懒洋洋地重复任意次数,以便尽可能地匹配。<\/if>
- 按字面意思匹配</if>
)
- 结束捕获组您需要进行全局搜索(g
修饰符)以匹配多个结果,并且您还需要.
来匹配换行符,即{{1修饰符。
结果匹配将在捕获组1中捕获。
答案 1 :(得分:1)
正则表达式:
<if[^<]*(?:<(?!if)[^<]*)*?<\/if>
我们的想法是检查当前<if
语句中是否没有开放if
标记。
<强>解释强>:
<if # Match `<if` tag
[^<]* # Anything up to a `<`
(?: # Start of non-capturing group (a)
<(?!if) # If `<` is not followed by `if` (there is no `if` inside current `if`)
[^<]* # Anything up to a `<`
)*? # End of non-capturing group (a) - repeat current pattern zero or more times (un-greedy)
<\/if> # Up to closing `</if` tag
答案 2 :(得分:-1)
你可以试试这个:
<(?!(if\s|else|\/if)).+?>