使用正则表达式检索文本中的内部条件

时间:2016-09-19 14:46:02

标签: c# regex

我有一个包含以下文本的文本文件(示例嵌套,如果,我知道它没有意义。):

<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>)

在此处查看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>

目前,它得到了我想要的组[1],但我只想让它成为整场比赛。

请不要使用其他方法/扩展来解析XML或文本。

修改

我尝试过两次复制和粘贴相同的东西,但是当它应该是两个匹配时,它仍然会出现一个匹配。

编辑2:

我在C#工作。

3 个答案:

答案 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>

Live demo

我们的想法是检查当前<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)).+?>