正则表达式和等号

时间:2013-11-20 21:45:07

标签: powershell

我想创建一个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部分发送到标题的值。

3 个答案:

答案 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)

问题是您使用的.*匹配任何内容,尽可能多次

你想使用匹配任何内容的.*?尽可能少

我认为这个正则表达式可能会满足您的需求:

(.*?)\=(.*)