Regex 多行正则表达式捕获两次?

Regex 多行正则表达式捕获两次?,regex,powershell,Regex,Powershell,我找不到正确的正则表达式来替换下面的行(在**之间的行): CustomSettings.ini ** ** 我试过这个: $TS=[io.file]::ReadAllText("test.txt") $TS -replace( "(?m)<step>\s+</step>(?:\s+<group>\s+<\/group>)*" , "AAAAAAA") $TS=[io.file]::ReadAllText(“test.txt”) $TS-替换(

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

CustomSettings.ini
**
**
我试过这个:

$TS=[io.file]::ReadAllText("test.txt")
$TS -replace( "(?m)<step>\s+</step>(?:\s+<group>\s+<\/group>)*" , "AAAAAAA")
$TS=[io.file]::ReadAllText(“test.txt”)
$TS-替换(“(?m)\s+(?:\s+\s+*”,“AAAAAAA”)
但替换字符串会插入两次:

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

如何使替换只发生一次?

有两个匹配项,因为有两个
实体,因此有两个替换项

您可以匹配第一个
和最后一个
之间的所有内容,以便只有一个匹配项

(?m)[\s\s]+(?:\s++\s+)*

这将匹配任何数量的只包含空格的
标记对:

(?:<(step|group)>\s+</\1>\s+)+
(?:\s+\s+)+
您可以进一步对其进行泛化,以匹配任何空标记对:

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

注意没有
(?m)
标志。它只影响开始和结束锚定(
^
$
),而不使用这些锚定。匹配包含多行的文本时不需要特别注意。

是的,两次,因为您有2个
。太好了,谢谢您提供的通用正则表达式!巧妙地使用了我从未见过的
\1
。它与
$1
完全相同吗?(我已经编辑了您的答案,以显示
/
)通常,正则表达式中的反引用使用反斜杠(
\1
),而替换字符串中的组引用使用美元符号(
$1
),但某些风格/工具对这两种类型都使用反斜杠。正斜杠在正则表达式中没有特殊意义。除非将其用作正则表达式分隔符,否则不需要对其进行转义,而且Powershell不使用正则表达式分隔符。
(?:<(step|group)>\s+</\1>\s+)+
(?:<(\w+)>\s+</\1>\s+)+