我有一个大文本文件,其中包含文本在浏览器中查看此电子邮件,然后是一个 URL。它可能会有所不同,有时 URL 的一部分会进入下一行。
此外,当它确实进入下一行时,末尾有一个等号需要删除,但可能存在的任何其他等号都没有。
几个例子:
在浏览器中查看此电子邮件 (https://us15.campaign-archive.com/?e=3D1460&u=3Df6e2bb1612577510b&id=3D2c8be)
在浏览器中查看此电子邮件
在浏览器中查看此电子邮件 (https://eg.com/?e=3D1460&u=3Df6510b&id=3D2c8be)
我需要使用 PowerShell 提取该 URL,不带方括号(括号),有时可以是 < > 这样我就可以将它下载为 HTML 文件。
`if ($str -match '(?<=\()https?://[^)]+') {
# # ... remove any line breaks from it, and output the result.
$Matches.0 -replace '\r?\n'
}
if ($str -match '(?<=\<)https?://[^>]+') {
# # ... remove any line breaks from it, and output the result.
$Matches.0 -replace '\r?\n'
}`
此解决方案适用于您提供的示例:
$text = @(
'View this email in your browser (https://us15.campaign-archive.com/?e=3D1460&u=3Df6e2bb1612577510b&id=3D2c8be)',
'View this email in your browser <https://mail.com/?e=3D14=
60&u=3Df612577510b&id=3D2c8be>',
'View this email in your browser (https://eg.com/?e=3D1460&u=3Df6510b&id=3D2c8be)'
)
$text = $text | ForEach-Object {
$PSItem.Replace('<','(').Replace('>',')').Replace("=`n",'').Split('(')[1].Replace(')','')
}
输出如下所示:
https://us15.campaign-archive.com/?e=3D1460&u=3Df6e2bb1612577510b&id=3D2c8be
https://mail.com/?e=3D1460&u=3Df612577510b&id=3D2c8be
https://eg.com/?e=3D1460&u=3Df6510b&id=3D2c8be
我只是使用没有正则表达式的替换。 你在拆分 url 上遇到的问题是通过做
解决的.Replace("=`n")
由于您正在尝试跨行匹配,因此您需要确保将您的文本文件作为一个整体读取,即作为单个多行字符串,您可以使用
-Raw
开关Get-Content
cmdlet.
除此之外,您的正则表达式中唯一缺少的就是匹配并删除换行符之前的前导
=
。
以下从输入文件
file.txt
中提取所有URL,并将它们输出——删除换行符和行尾=
——作为字符串数组:
# Note the '=' before '\r?\n'
[regex]::Matches(
(Get-Content -Raw file.txt),
'(?<=[<(])https://[^>)]+'
).Value -replace '=\r?\n'
[regex]::Matches()
.NET API 允许您一次提取 all 匹配项,而 PowerShell 的 -match
运算符只会查找 one 匹配项。
-matchall
运算符的提议。-replace
然后用于从匹配中删除换行符(\r?\n
),以及前面的=
.
有关 URL 匹配正则表达式的解释以及使用它进行试验的能力,请参阅this regex101.com page。
多行字符串文字示例:
[regex]::Matches('
View this email in your browser (https://us15.campaign-archive.com/?e=3D1460&u=3Df6e2bb1612577510b&id=3D2c8be)
View this email in your browser <https://mail.com/?e=3D14=
60&u=3Df612577510b&id=3D2c8be>
View this email in your browser (https://eg.com/?e=3D1460&u=3Df6510b&id=3D2c8be)
',
'(?<=[<(])https://[^>)]+'
).Value -replace '=\r?\n'
输出:
https://us15.campaign-archive.com/?e=3D1460&u=3Df6e2bb1612577510b&id=3D2c8be
https://mail.com/?e=3D1460&u=3Df612577510b&id=3D2c8be
https://eg.com/?e=3D1460&u=3Df6510b&id=3D2c8be