正在努力使用PowerShell从字符串下面的方括号中提取值
in relation to any Facility C Loan [?10%?] per cent. per annum; "Facility A Commitments" means the aggregate of the Facility A Commitments, being [????????10 million?????] at the date of this Agreement.
需要的输出:
10% 10 million
答案 0 :(得分:0)
这是这两种情况的正则表达式:
(?<=\[\?+)[^\?]*(?=\?+\])
您可以在https://regex101.com上玩它 但是,这不支持非固定宽度的后跟(第一个加号)。不过,它应该可以在.NET / PowerShell中工作。
这对您有好处:
答案 1 :(得分:0)
在内存(PSv4 +)中具有单个多行字符串:
$str = @'
in relation to any Facility C Loan [?10%?] per cent. per annum;
"Facility A Commitments" means the aggregate of the Facility A Commitments, being [????????10 million?????] at the date of this Agreement.
'@
[regex]::matches($str,'\[\?+([^?]+)\?+\]').ForEach({ $_.Groups[1].Value })
使用带有Get-Content
和Select-String
的管道进行逐行处理(PSv3 +):
$lines = @'
in relation to any Facility C Loan [?10%?] per cent. per annum;
"Facility A Commitments" means the aggregate of the Facility A Commitments, being [????????10 million?????] at the date of this Agreement.
'@ -split '\r?\n'
# Substitute your `Get-Content someFile.txt` call for $lines
$lines |
Select-String '\[\?+([^?]+)\?+\]' |
ForEach-Object { $_.Matches.Groups[1].Value }
正则表达式\[\?+([^?]+)\?+\]
的解释:
\[
与文字[
匹配\?+
匹配一个或多个(+
)文字?
([^?]+)
是一个捕获组((...)
),它与 not字符集(+
)中的一个或多个([...]
)字符匹配(^
)的一部分,即不是?
字符的 的任何字符-这是要提取的感兴趣的值。\?+
匹配一个或多个文字?
\]
与文字]
匹配 [regex]::Matches()
和.Matches
发出的对象上的Select-String
属性是[System.Text.RegularExpressions.Match]
对象的集合,它们的.Groups
属性包含两个完全匹配项(索引0
)和每个捕获组捕获的内容(1
包含第一个捕获组的值,...)。
答案 2 :(得分:-1)
第一次运行:
$message -match '\[\?(\d*%)\?\]'
echo $Matches[1]
第二个:
\[\?*(\d* million)\?*\]
echo $Matches[1]
在每次迭代中,您都可以像检查$message -match '...'
返回$ True一样简单,然后检查$ Matches变量中的值(这是一个保存正则表达式结果的系统变量。