2013-11-20 4 views
0

Я хочу создать выражение regelar для фильтрации строк в кучке текстовых файлов. В основном каждый символ может быть в файле, но мне нужен только определенный набор строк, содержащий информацию о подключении direct. Параметры connect direct всегда имеют один и тот же тип формы. Например:Регулярное выражение и знак равенства

transfer.info=replace 
file.location=\\adfs\work\department\building 

я отправить его в массив abjocts так что я могу создать файл CSV с ним. Файл содержит заголовок первой части (transfer.info; file.location) , а значения хранятся в отдельной строке.

Это работает, но у меня есть одна проблема, когда в значении есть знак extra =. , например:

remote.job=cer.ext.ftm(recl=1500 block=4500) 

Я хочу, чтобы в результате чего он помещает remote.job в заголовке, а остальные за де первым = ставятся в качестве значения, а не дополнительный 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 часть к значению заголовка.

ответ

1

Я могу придумать два способа убедиться, что = соответствует первому, а не последнему вхождению в строку.

Можно указать, что вещь слева от знака равенства не может содержать знак равенства:

([^=]*)=(.*) 

Или вы могли бы сделать, не жадный поиск вещь слева от знака равенства :

(.*?)=(.*) 
+0

Кстати, @ user3015037, я думаю, вы могли бы действительно упростить свой вопрос. Он был наполнен нерелевантной информацией, из-за которой трудно было решить, о чем вы спрашиваете. –

+0

ОК, я буду иметь это в виду. :) – user3015037

+0

Но я вижу много вопросов, на которых жаловаться мало информации, поэтому, я думаю, я пошел за борт в другую сторону. – user3015037

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 
0

Проблема заключается в том, что вы используете .*, который соответствует любому, столько раз, сколько это возможно.

Вы хотите использовать .*?, который соответствует любому, в несколько раз, как это возможно

Я думаю, что это регулярное выражение может делать то, что вам нужно:

(.*?)\=(.*)

0

Thx за ответы.

Я думаю, что я уже пробовал это с добавлением? к маю это не жадный. Но я дам еще одну попытку, держу вас в курсе.

Смежные вопросы