2017-03-02 3 views
1

Ich habe eine ziemlich große Textdatei, die einzelne in Anführungszeichen gesetzte Zeichenfolgen in Klammern enthält.RegEx Split in Abschnitte dann Zeichenfolgen übereinstimmen

[ 
'stringIneedToExtractBetweenSingleQuotes' some other 
text 
and 
characters asdasf/*- 'AnotherStringIneedToExtract' 
] 

[ 
'anotherstring' some other 
text and characters asdasfds/*- 'PleaseExtractMe' 
] 

[...] 

Ich mag würde die Saiten zwischen Anführungszeichen in den getrennten Abschnitten durch Klammern begrenzt bekommen, wie Array-Indizes,

$array[0] oder $matches[0]

stringIneedToExtractBetweenSingleQuotes 

AnotherStringIneedToExtract 

$array[1] oder $matches[1]

anotherstring 

PleaseExtractMe 

Mit '(.*?)' Ich kann alle Saiten zwischen einfachen Anführungszeichen extrahieren, aber ich bin nicht sicher, welcher Sinn zu verwenden macht:

  1. Verwenden Powershell .split(']') Methode dann den Text in Arrays aufgeteilt '(.*?)' verwenden, um die Saiten zu extrahieren.

  2. Am meisten bevorzugten Weg (wenn es möglich ist), verwenden Sie Regex, um diese Zeichenfolgen zu extrahieren und in Abschnitte unter Verwendung von [] als Trennzeichen aufzuteilen.

+0

Ich denke nicht, dass Sie die Zeichenfolge teilen müssen, verwenden Sie nur Sammelgruppen, nachdem Sie Ihre Regex ausgeführt haben. https://mcpmag.com/articles/2015/09/30/regex-groups-with-powershell.aspx –

+0

_pretty große Textdatei_ ist subjektiv. Können Sie das mit Anzahl oder Zeilen oder durchschnittlicher Dateigröße quantifizieren? – Matt

+0

Gibt es irgendwelche einfachen Anführungszeichen, die die Klammern in Ihrer Datei _outside_ enthalten? Oder muss das Vorhandensein der Klammern nicht wirklich berücksichtigt werden? – Matt

Antwort

0

Da es sich um eine große Datei ist, würde ich Get-Content mit -Readcount verwenden, um die I/O-Operationen zu reduzieren. Dann können Sie -match und -replace als Array Operatoren gekettet zu filtern und dann die erforderlichen Daten zu extrahieren:

$ExtractedLines= 
Get-Content .\testdata.txt -ReadCount 1000 | 
ForEach-Object {$_ -match ".*'.+'.*" -replace ".*'(.+)'.*",'$1'} 

Edit:

Wenn Sie die eckigen Klammern halten wollen:

$ExtractedLines= 
Get-Content .\testdata.txt -ReadCount 1000 | 
ForEach-Object {$_ -match ".*'.+'.*|[\[\]]" -replace ".*'(.+)'.*",'$1'} 

dann Teilen Sie das auf, indem Sie die eckigen Klammern als Trennzeichen verwenden.

+0

Danke @mjolinor Ich habe gerade viele wahre und falsche Ausgabe, darf ich fragen, warum verwenden Sie -replace und was ist die Variable $ 1 ersetzen? – Gareth

+0

Verwenden Sie die Option "ReadCount 1000" auf Get-Content? Ohne das (oder mit einem ReadCount von 1, was die Standardeinstellung ist) erhalten Sie die Wahr/Falsch-Rückgabe. Ich verwende -replace, um den gesamten Text außerhalb der Anführungszeichen zu entfernen. Das $ 1 repräsentiert die erste Erfassungsgruppe, das ist der Text innerhalb der einzelnen Anführungszeichen. – mjolinor

+0

Cool, danke. Jetzt funktioniert es mit -ReadCount Nun wissen Sie, wie kann ich die Zeichenfolgen mit Klammern gruppieren? zum Beispiel enthält $ array [0] Zeichenfolgen zwischen den ersten Klammern, derzeit verwende ich die folgenden, um die Zeichenfolgen in Klammern zu gruppieren: '(Get-Content -raw. \ text.log) .split (']') [0 ] | select-string -pattern '(. *?)' -AllMatches | foreach {$ _. matches.value} ' Dies gibt mir übereinstimmende Strings zwischen den ersten [] – Gareth