【问题标题】:RegEx and Replace正则表达式和替换
【发布时间】:2011-06-16 04:08:20
【问题描述】:

我有一个我正在尝试编写的 Powershell 脚本,以通过格式不佳的 XML 文件查找任何节点名称中包含“日期”一词的节点。即。

<System><SystemName>Acme</Systemname><SystemDate>313</SystemDate><SystemNumber>3</SystemNumber><FileDate>394</FileDate></System>

上述模式在整个文件中重复了数百次......对于大约 70MB 的数据。

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

我需要做的是扫描文件并查找以“日期”结尾且值不是 4 位的任何节点,并替换为 4 位值。

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

使用上面的例子,它应该找到关闭&lt;/SystemDate&gt;和关闭&lt;/FileDate&gt;节点,看到数字只有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

任何帮助将不胜感激!

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    (我认为您的代码过于简化了……例如,您可能是想说$regex.Replace($infile,"&gt;9999&lt;/$1")

    除此之外,我要做的第一件事是使匹配的正则表达式更加精确:"&gt;\d\d\d&lt;/([^&gt;]*Date)" ...我假设 PowerShell 的正则表达式实现与其他实现一样是贪婪的。这可能会立即解决问题。

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

    【讨论】:

    • 我不确定我是否听懂了你的意思。但是我阅读正则表达式的方式是在标签中包含 *Time 的任何内容的开始标签最后一个括号(来自前一个元素)和下一个元素的开始结束标签之间找到 3 位数字。
    • 正则表达式不是在“标签内”,而是在查看整个文本。 .* 表示任何文本。所以&gt;\d\d\d&lt;/.*Date 应用于&lt;Date&gt;123&lt;/Date&gt;&lt;a&gt;a&lt;/a&gt;...otherstuff...&lt;Date&gt;2011&lt;/Date&gt; 将匹配从&gt;123 到倒数第二个字符的所有内容。这是假设 PowerShell 正则表达式是“贪婪的”。
    • 参加聚会有点晚了,但我同意 Zac 的解决方案,除了它会在“>321”的文本中匹配“>321”。通过使用模式 ">\d\d\d([^>]*Date>)" 并相应地调整替换文本来解决此问题。
    • @Elroy Yah,OP 说“节点名称的一部分”和“以 ... 结尾”,因此您的修复很可能更接近他们的实际需求。但从问题中并不清楚。
    【解决方案2】:
    $xmlDocument = [XML](get-content z:\system.txt)
    

    使用 XML 样式

    【讨论】:

    • 我喜欢这个想法,但对于 OP 来说可能更难,因为需要匹配所有匹配 *Date* 的节点。但是,如果这是一个已知的小集合,那么我认为使用 XML 方法会简单得多。
    • 我最初使用的是 [XML],而 REGEX 根本没有工作,显示文件只是显示空白。虽然我可以成功地使用 foreach 遍历节点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2015-01-24
    相关资源
    最近更新 更多