我想创建一个regelar表达式来过滤一堆文本文件中的行。 基本上每个符号都可以在文件中,但我只需要一组包含connect direct信息的特定行。 connect direct的参数始终采用相同的形式。 例如:
transfer.info=replace
file.location=\\adfs\work\department\building
我将它发送到一个abjocts数组,所以我可以用它创建一个csv文件。 该文件包含第一部分的标题(transfer.info; file.location) 并且值存储在单独的行中。
这有效,但我有一个问题,即值中有一个额外的=符号。 例如:
remote.job=cer.ext.ftm(recl=1500 block=4500)
我希望结果是他将remote.job放在标题中,而de first =后面的其余部分作为值放置,而不是像iet那样的额外标题recl现在。
到目前为止我的代码就是这个。
$csvobjecten = @()
$keyfiles = (dir "P:\APPS\D96_2903\ftkeys\AM\ACC" -recurse | where {$_.Name -match "def$"}).FullName
foreach ($file in $keyfiles) {
$object = New-Object –TypeName PSObject
$object | Add-Member –MemberType NoteProperty –Name KeyfileName –Value $file
$inhoud = get-content $file
foreach ($record in $inhoud) {
if(($record -match "(.*)\=(.*)")) {
$object | Add-Member –MemberType NoteProperty –Name $matches[1] –Value $matches[2]
}
}
$csvobjecten += $object
}
$csvobjecten | Export-Csv -delimiter ";" -NoTypeInformation "c:\temp\keyfiles.csv"
结果是这个标题
KeyfileName;"Transfer.info";"File.Location";"remote.job=cer.ext.ftm(recl=1500 block";
我想要的地方
KeyfileName;"Transfer.info";"File.Location";"remote.job";
并将cer.ext.ftm(recl=1500 block
部分发送到标题的值。
答案 0 :(得分:2)
在第一次捕捉中使用(。*?)。的?让它成为一个懒惰的"匹配,而不是"贪婪"。一旦发现足以满足比赛的目的,它就会停止。
$inhoud = 'remote.job=cer.ext.ftm(recl=1500 block=4500)'
$object = new-object psobject
foreach ($record in $inhoud) {
if(($record -match "(.*?)\=(.*)")) {
$object | Add-Member –MemberType NoteProperty –Name $matches[1] –Value $matches[2]
}
}
$object
答案 1 :(得分:1)
我可以考虑两种方法来确保=
匹配字符串中的第一个而不是最后一个匹配。
您可以指定等号左边的东西不能包含等号:
([^=]*)=(.*)
或者你可以对等号左边的东西进行非贪婪的搜索:
(.*?)=(.*)
答案 2 :(得分:0)
问题是您使用的.*
匹配任何内容,尽可能多次。
你想使用匹配任何内容的.*?
,尽可能少
我认为这个正则表达式可能会满足您的需求:
(.*?)\=(.*)