使用Regex检索文本中的内部Most-If条件
本文关键字:内部 Most-If 条件 Regex 检索 文本 使用 | 更新日期: 2023-09-27 18:07:32
我有一个包含以下文本的文本文件(如果嵌套示例,我知道它没有意义。(:
<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语句。我目前有以下Regex,但它并没有像我预期的那样起作用。Regex语句本质上只需要是不包含<if
的任意if语句。
// first if that doesn't contain <if to </if>
['s'S]*(<if['s'S]*?(?!.*<if)['s'S]*?<'/if>)
请在此处查看http://regexr.com/3e8p7
我想捕捉的只是:
<if string=%fld.plaintiffsSex eql=Female>
<set field=plaintiffPronoun1 value=[her]>
<set field=plaintiffPronoun2 value=[she]>
<set field=plaintiffPronoun3 value=[her]>
</if>
目前,它得到了我作为第一组想要的,但我只希望它是整场比赛。
请不要使用解析XML或文本的替代方法/扩展来回答。
编辑:
我试着复制和粘贴同一个东西两次,但它仍然只有一个匹配,而应该是两个。
编辑2:
我在C#工作。
(<if(?:(?!<if).)*?<'/if>)
https://regex101.com/r/yG2cU4/1
(
-开始捕获组<if
-与<if
完全匹配(?:(?!<if).)*?
-匹配任何后面没有<if
的单个字符的任意数量,并延迟执行,这意味着它将匹配仍然允许正则表达式匹配的最小长度。(?:
-开始一个非捕获组(一个组,但未捕获匹配((?!<if).
-负面展望,基本上断言字符后面的内容不是<if
)*?
-懒惰地重复任意次数,以便尽可能匹配最小值
<'/if>
-字面匹配</if>
)
-结束捕获组
您需要进行全局搜索(g
修饰符(来匹配多个结果,还需要.
来匹配换行符,即s
修饰符。
结果匹配将在捕获组1中捕获。
Regex:
<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
你可以试试这个:
<(?!(if's|else|'/if)).+?>