Regex 正则表达式和替换

Regex 正则表达式和替换,regex,powershell,Regex,Powershell,我有一个Powershell脚本,我正试图编写该脚本,通过一个格式不好的XML文件查找节点名中包含单词“Date”的节点。即 <System><SystemName>Acme</Systemname><SystemDate>313</SystemDate><SystemNumber>3</SystemNumber><FileDate>394</FileDate></System>

我有一个Powershell脚本,我正试图编写该脚本,通过一个格式不好的XML文件查找节点名中包含单词“Date”的节点。即

<System><SystemName>Acme</Systemname><SystemDate>313</SystemDate><SystemNumber>3</SystemNumber><FileDate>394</FileDate></System>
Acme3133394
考虑到文件,上面的模式重复了数百次。。。大约70MB的数据

真正的文件有更多的节点,没有换行符或任何东西。。。所以这一切都出现在一行上

我需要做的是扫描文件,查找以“Date”结尾的节点,其中值不是4位,并替换为4位

这是我到目前为止所拥有的。。。但看起来替换只是改变了第一次出现的情况,而不是第一次匹配后的所有其他匹配

使用上面的示例,它应该找到closing
和closing
节点,并看到数字仅为3个字符,并替换为9999

 $infile=get-content z:\system.txt
 write-host $infile.Length
 $regex = New-Object System.Text.RegularExpressions.Regex ">\d\d\d</(.*Date)"
 $replace = $regex.Replace($infile,"9999")
 write-host $infile.Length
 write-host $replace.Length
 set-content -Value $replace z:\new_system.txt
$infle=获取内容z:\system.txt
写入主机$infle.Length
$regex=新对象System.Text.RegularExpressions.regex“>\d\d\d
Do it XML风格(我认为您的代码过于简化了…例如,您可能想说
$regex.Replace($infle,“>9999\d\d]*Date)”
。。我假设PowerShell的regex实现与其他实现一样贪婪。这可能会立即解决问题


如果没有,我认为自然的做法是循环。但是Replace方法声称要将它们全部替换,所以我认为应该可以避免这种情况。

我喜欢这个想法,但OP可能更难,因为需要匹配所有匹配
*Date*
的节点。但是,如果这是一个小的已知集,那么我我想使用XML方法会简单得多起初,REGEX根本不起作用,显示文件只是显示空白。虽然我可以使用foreach成功地遍历节点。我不确定我是否遵循了你的说法。但我阅读REGEX的方法是在openiging标记的开始和最后一个括号(来自上一个elment)之间找到3位数字和下一个元素上的开始-结束标记,用于标记内有*时间的任何内容。正则表达式不是“在标记内”,而是查看整个文本。
*
表示所有文本。因此
\d\d\d123
一直到最后一个字符。这是假设PowerShell正则表达式是“贪婪的”“.参加聚会有点晚,但我同意Zac的解决方案,只是它与“>321321”匹配。通过使用模式“>\d\d]*Date>”)并相应调整替换文本来解决此问题。@Elroy Yah,OP同时显示“节点名的一部分”和“结束于…”,因此您的解决方案很可能更接近他们的实际需要。但问题并不清楚。
$xmlDocument = [XML](get-content z:\system.txt)