我正在尝试从使用EWS下载的文本文件中提取一串数据。我正在使用powershell来做到这一点。该文件的片段如下。
<table class="button" style="border-collapse: collapse; border-spacing: 0; overflow:
hidden; padding: 0; text-align: left; vertical-align: top; width: 100%;"><tbody>
<tr style="padding: 0; text-align: left; vertical-align: top;"><td style="-moz-hyphens: none;
-webkit-hyphens: none; -webkit-text-size-adjust: none; background: #049FD9;
border: none; border-collapse: collapse !important; border-radius: 2px; color: #fff; display: block; font-family: 'Helvetica-Light','Arial',sans-serif; font-size: 14px; font-weight: lighter; hyphens: none; line-height:19px; margin: 0; padding: 8px 16px; text-align: center; vertical-align: top; width: auto
!important; word-break: keep-all;">
<a href="https://www.website.com:443/idb/setPassword?t=BcHJEoIgAADQD%2BKQjqZ4VEKtBHLJJm82uWDuxCR%2Bfe%2B58Rl9HRz6QddWkO5MLDXuF6e9m%2Bo0z%2FCVS%2B9IenAp5m5yTfYRa%2BAn4jdWHHF7HTyqRZiRRiNDEE%2BK7ZJywLKeNCTj4ewu4QNu02qXB0ZTXTyxXADwaLeluZGVPCxGXunpVcHbiCVAWRR7ykqGensLVBsqNUpl%2FQE%3D"
style="-webkit-text-size-adjust: none; font-weight: 100; color: #fff; font-family: 'Helvetica-Light','Arial',sans-serif; font-size: 20px; font-weight: lighter; line-height: 32px; text-decoration: none;">Get Started</a> </td></tr></tbody></table></td>
我想提取这个部分的 BcHJEoIgAADQD%2BKQjqZ4VEKtBHLJJm82uWDuxCR%2Bfe%2B58Rl9HRz6QddWkO5MLDXuF6e9m%2Bo0z%2FCVS%2B9IenAp5m5yTfYRa%2BAn4jdWHHF7HTyqRZiRRiNDEE%2BK7ZJywLKeNCTj4ewu4QNu02qXB0ZTXTyxXADwaLeluZGVPCxGXunpVcHbiCVAWRR7ykqGensLVBsqNUpl%2FQE%3D
我尝试过匹配并使用正则表达式的后视和前锋,但似乎没有任何东西只能抓住那部分。
认为这样的事可能有效
$a = Get-Content $path
$a -match '(?<=setPassword\?t\=)(.+)(?=" style)'
$matches
但它出现空白
答案 0 :(得分:4)
最好不要为此使用字符串操作;使用现有的库和类。
首先,将您的URI视为[uri]
:
$uri = [System.Uri]'https://www.website.com/idb/setPassword?t=BcHJEoIgAADQD%2BKQjqZ4VEKtBHLJJm82uWDuxCR%2Bfe%2B58Rl9HRz6QddWkO5MLDXuF6e9m%2Bo0z%2FCVS%2B9IenAp5m5yTfYRa%2BAn4jdWHHF7HTyqRZiRRiNDEE%2BK7ZJywLKeNCTj4ewu4QNu02qXB0ZTXTyxXADwaLeluZGVPCxGXunpVcHbiCVAWRR7ykqGensLVBsqNUpl%2FQE%3D'
现在您可以像这样获取查询字符串:
$query = $uri.Query
这将从?t=
开始,所以让我们解析它:
$queryData = [System.Web.HttpUtility]::ParseQueryString($query)
结果对象有一组键,每个值一个。由于您想要的密钥名为t
,因此您可以获得如下值:
$queryData['t']
答案 1 :(得分:0)
所以我想出了我输出的文本文件是包装长网址的一部分。我最终使用-Width命令输出,因此它不会这样做。
$email | Out-File $path -Width 9999999
然后我最终使用匹配来获取我需要使用的字符串。
$a = Get-Content $path | Where-Object {$_ -match '(?<=https:\/\/www\.website\.com:443\/idb\/setPassword\?t=)(.+)(?=" style)'}
$matches[1]
希望能有所帮助。