使用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#工作。

使用Regex检索文本中的内部Most-If条件

(<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)).+?>