Regex PowerShell正则表达式在换行符附近不匹配
我有一个exe格式的输出 并尝试使用PowerShell脚本将Regex PowerShell正则表达式在换行符附近不匹配,regex,powershell,newline,Regex,Powershell,Newline,我有一个exe格式的输出 并尝试使用PowerShell脚本将CCITT组4提取到$var $var = [regex]::match($exeoutput,'Compression\s+:\s+([\w\s]+)(?=\n)').Groups[1].Value 例如,regexpCompression\s+:\s+([\w\s]+)(?=\n)是正确的,但不是PowerShell。PowerShell不匹配。如何正确地编写regexp?您希望从某个特定模式中获取所有文本,直到行尾。因此,您甚
CCITT组4
提取到$var
$var = [regex]::match($exeoutput,'Compression\s+:\s+([\w\s]+)(?=\n)').Groups[1].Value
例如,regexp
Compression\s+:\s+([\w\s]+)(?=\n)
是正确的,但不是PowerShell。PowerShell不匹配。如何正确地编写regexp?您希望从某个特定模式中获取所有文本,直到行尾。因此,您甚至不需要前瞻(?=\n)
,只需使用+
,因为
匹配除换行符(LF)字符以外的任何字符:
或者,您可以使用-match
运算符,在找到匹配项后,使用$matches[1]
访问捕获的值:
$exeoutput -match 'Compression\s*:\s*(.+)'
$var = $matches[1]
简化您的正则表达式,并向您展示如何使用PowerShell的-match
操作符作为替代
关于管道到输出字符串
修复问题的后续评论意味着您的问题是$exeOutput
包含一个行数组,而不是单个多行字符串
当您捕获对外部程序(*.exe
)的调用的输出时,确实会发生这种情况:PowerShell将标准输出行捕获为字符串数组(没有尾随换行符的行)
作为将数组$EXEOUT
转换为带有Out string
的单个多行字符串的替代方法(顺便说一句,这很慢[1]),您可以使用直接对数组进行操作:
# Stores 'CCITT Group 4' in $var
$var = switch -regex ($exeOutput) { 'Compression\s+:\s+(.+)' { $Matches[1]; break } }
或者,给定
$exeOutput
中行的特定格式,您可以利用,在将
:
分隔符替换为=
后,它可以为您将行解析为键值对:
$var = ($exeoutput -replace ':', '=' | ConvertFrom-StringData).Compression
[1] 使用cmdlet通常比使用表达式慢;使用字符串数组
$array
作为输入,您可以实现$array | Out string
使用$array-join“`n”
更高效的功能,不过请注意,Out string
还附加了一个尾随的换行符。我怀疑您可能有\r\n
。但是,您根本不需要向前看,因为要到达第一个换行符,您可以使用*
或+
。您可以显示吗?这对我来说似乎很好:@PetSerAl奇怪,tio.run工作正确,但我的本地脚本不正确?先生?佩瑟拉尔比你们所有人都好。我理解,我将exe输出转换为字符串(| Out string
),这是值得的。
# Stores 'CCITT Group 4' in $var
$var = switch -regex ($exeOutput) { 'Compression\s+:\s+(.+)' { $Matches[1]; break } }
$var = ($exeoutput -replace ':', '=' | ConvertFrom-StringData).Compression