PowerShell中的正则表达式仅匹配该行的第一个匹配项

时间:2017-06-15 11:08:58

标签: regex powershell csv

我需要构建一个脚本,该脚本从各种日志文件中读取数据,并使用powershell将数据放入csv中。输出csv应该有第一列作为日志文件的名称,第二列应该有来自日志文件的一些特定内容。第二列的内容不应该出现在同一文件中两次,这就是为什么第一列包含日志文件名。我设法提取了两种类型的数据,但我的脚本只使用正则表达式模式匹配第一次匹配,然后将结果放入csv。

我正在使用以下脚本:

$test = gc .\datalog.txt | Select-String -Pattern '"\w:\\\w+\\' -NotMatch |
ForEach-Object {
New-Object psobject -Property @{
D_no = [regex]::Matches($_, '^[^\:]*[^\.log:]')
D_name = [regex]::Matches($_, '((?!\\)\w+\S+(?=\\)|(\w:\w+)[^"])').Groups[1].value
    }
}
$test | Select-Object D_no, D_name | Export-Csv abc.csv -NoTypeInformation

我的脚本中的D_name仅匹配该行的第一个匹配项,因为我的目标操作是使用D_name中的正则表达式捕获所有条目。但是,当我使用

时,正则表达式工作正常
Select-String -allmatches '^[^\:]*[^\.log:]|(?!\\)\w+\S+(?=\\)|(\w:\w+)[^"]').Matches.Value

但是这为D_no和D_name提供了一个列中的数据。  The sample data can be found here

1 个答案:

答案 0 :(得分:1)

对于OnItemSelectedListener,您只提取一个匹配组 - D_name。所以这是预期的结果。要将所有匹配结果放入Groups[1].value,然后将其正确导出为CSV,您必须将它们组合成一个字符串。例如:

D_name

请注意,从New-Object psobject -Property @{ D_no = [regex]::Matches($_, '^[^\:]*[^\.log:]').Value D_name = ([regex]::Matches($_, '((?!\\)\w+\S+(?=\\)|(\w:\w+)[^"])') | foreach {$_.Value}) -join ',' } 的第一个表达式中,您还可以获得MatchCollection,但只包含1个元素。我建议从中获取一个Value属性。