我找不到正确的正则表达式来替换下面的行(**之间的行):
<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="">
如何才能让替换只进行一次?
答案 0 :(得分:1)
有两个匹配,因为有两个<step></step>
个实体,因此有两个替换。
您可以匹配第一个<step>
和最后一个<\/step>
之间的所有内容,以便只有一个匹配。
(?m)<step>[\s\S]+<\/step>(?:\s+<group>\s+<\/group>)*
答案 1 :(得分:1)
这将匹配任何数量的只包含空格的<step>
或<group>
个标记对:
(?:<(step|group)>\s+</\1>\s+)+
您可以进一步概括它以匹配任何空标记对:
(?:<(\w+)>\s+</\1>\s+)+
请注意缺少(?m)
标志。它只会影响开始和结束锚点(^
和$
),而您不会使用它们。匹配包含多行的文本不需要特殊的预防措施。