Regex 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?您希望从某个特定模式中获取所有文本,直到行尾。因此,您甚

我有一个exe格式的输出

并尝试使用PowerShell脚本将
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