【问题标题】:Store regex match into variable then write to text file - PowerShell将正则表达式匹配存储到变量中,然后写入文本文件 - PowerShell
【发布时间】:2025-12-04 14:25:01
【问题描述】:

我正在阅读一个看起来像的文本文件

<tr><td>W543562</td><td>OPEN</td><td>003</td><td>4</td></tr>
<tr><td>W543563</td><td>OPEN</td><td>003</td><td>4</td></tr>
<tr><td>W543564</td><td>OPEN</td><td>003</td><td>4</td></tr>
<tr><td>W543565</td><td>OPEN</td><td>003</td><td>4</td></tr>
</tbody></table></div></div></body></html>

我对 W# 特别感兴趣。我想抢号码,然后回写到文本文件,变成这样变成超链接

<tr><td><a href="https://www.website.com/Order=W543562">W543562</a></td><td>OPEN</td><td>003</td><td>4</td></tr>
<tr><td><a href="https://www.website.com/Order=W543563">W543563</a></td><td>OPEN</td><td>003</td><td>4</td></tr>
<tr><td><a href="https://www.website.com/Order=W543564">W543564</a></td><td>OPEN</td><td>003</td><td>4</td></tr>
<tr><td><a href="https://www.website.com/Order=W543565">W543565</a></td><td>OPEN</td><td>003</td><td>4</td></tr>
</tbody></table></div></div></body></html>

我拥有的是

$text = [IO.File]::ReadAllText("C:\Temp\parse3.txt")
$url = "https://www.website.com/=W"

$Matches = [regex]::matches($text, "<td>W([\s\S]*?)</td>")
foreach ($match in $Matches)
{
    Write-Output $match.Groups[1].Value.Trim();
}

它会拉出 W# 并将其显示在每一行上,但我需要将每一个存储到一个变量中,然后使用它写回每一行并连接 $url

理想情况下,如果我可以将代码缩减为 Select-String "&lt;td&gt;W-&lt;/td&gt;" | Add-Content $url+w# 之类的内容,那就太好了。但据我所知,Select-String 不适合在其他字符之间选择字符并修剪开头和结尾。更不用说找到特定范围的动态字符了。

有什么想法吗?

【问题讨论】:

  • @MadPhysicist 那里有很多东西要解压。我在另一篇文章中被告知要研究正则表达式以解决我的问题。当我使用 PowerShell 解析 .txt 文件以返回文本时,它与实际的 HTML 标记无关。我正在解析纯文本,以便将Add-Content 之类的操作返回到文件中。我觉得不是。它不能解决我的问题。但不错的尝试。
  • 不要使用 RegEx 解析 HTML。 *.com/a/1732454/1936966 。使用 HTMLagilityPack 或类似的东西

标签: html regex powershell url


【解决方案1】:

有更有效的方法可以做到这一点,但如果长期性能不是问题,您可以这样做:

$text = [IO.File]::ReadAllText("C:\Temp\parse3.txt")
$url = "https://www.website.com/Order="

[regex]::Matches($text, "W\d{6}") | % { $text = $text -replace $_.Value, "<a href=`"$url$($_.Value)`">$($_.Value)</a>" }

$text

这是怎么回事……

[regex]::Matches

...找到所有匹配项

"W\d{6}"

...通过正则表达式搜索找到后跟任意 6 个数字的 W 的出现

%

...也可以写成Foreach-Object。您正在将输出传送到以下脚本块。 $_ 指的是在管道中找到的每个单独的匹配项。

-replace

... 是另一个用于替换正则表达式模式的 PowerShell 正则表达式函数。

其余的只是指定您要使用插值字符串替换它的值。字符串插值需要在双引号内完成,因此字符串内的 href 引用的双引号需要使用反引号进行转义。像 $_.Value 这样点引用的插值变量需要包含在字符串内的$(...) 结构中。

许多其他可能更好的方法来做到这一点,但希望这会有所帮助。

【讨论】:

  • 这太棒了。但是有没有办法用新值保存更新的文件?它在 ISE 中完美打印,但不会更新文件本身。我尝试在末尾添加"&lt;$url$($_.Value)`"&gt;$($_.Value)&lt;/a&gt;" } | Out-File C:\Temp\parse4.txt,但它保存了一个空白文件。
  • 因此脚本块更改了 $text 的值,但不会将其输出回管道。只需删除 | Out-File C:\Temp\parse4.txt $text 并添加另一行 Out-File C:\Temp\parse4.txt $text 即可解决问题。
  • 完美!我遇到了System.OutOfMemoryException,但我必须以某种方式解决这个问题。非常感谢!
  • 你运行这个的文件有多大?
  • 773KB 大。