多线正则表达式捕获了两次?

时间:2015-12-22 16:17:48

标签: regex powershell

我找不到正确的正则表达式来替换下面的行(**之间的行):

<variable name="RulesFile" property="RulesFile">CustomSettings.ini</variable>
</defaultVarList>
      </step>
      **<step>
      </step>
      <step>
      </step>
      <group>
      </group>
      <group>
      </group>
      <group>
      </group>
      <group>
      </group>
      <group>
      </group>**
    </group>
    <group name="Client Profile" description="">

我试过了:

$TS=[io.file]::ReadAllText("test.txt")
$TS -replace( "(?m)<step>\s+</step>(?:\s+<group>\s+<\/group>)*" , "AAAAAAA")

但替换字符串插入两次:

<variable name="RulesFile" property="RulesFile">CustomSettings.ini</variable>
</defaultVarList>
      </step>
      AAAAAAA
      AAAAAAA
    </group>
    <group name="Client Profile" description="">

如何才能让替换只进行一次?

2 个答案:

答案 0 :(得分:1)

有两个匹配,因为有两个<step></step>个实体,因此有两个替换。

您可以匹配第一个<step>和最后一个<\/step>之间的所有内容,以便只有一个匹配。

Example Here

(?m)<step>[\s\S]+<\/step>(?:\s+<group>\s+<\/group>)*

答案 1 :(得分:1)

这将匹配任何数量的只包含空格的<step><group>个标记对:

(?:<(step|group)>\s+</\1>\s+)+

您可以进一步概括它以匹配任何空标记对:

(?:<(\w+)>\s+</\1>\s+)+

请注意缺少(?m)标志。它只会影响开始和结束锚点(^$),而您不会使用它们。匹配包含多行的文本不需要特殊的预防措施。