Frage von Boarschdi, 125

RegEx string zwischen zwei Zeichen?

Hallo, ich suche einen RegEx, der mir genau den String rausgibt, der zwischen dem 5 und 6 Pipe "|" steht. Also in diesem fall "TESTEVENT"

2016-01-25 14:42:05,985|ERROR|AssemblyLines/iman_hr_file|||TESTEVENT||

Expertenantwort
von TeeTier, Community-Experte für programmieren, 97

Linux? Shell? Nimm awk:

awk -F\| '{print $6}' foo.txt

Einfacher als grep mit RegEx, oder? :)

PS: Mit "-F" wird der Separator spezifiziert, und der Rest gibt das 6te Feld einer jeden Zeile aus. :)

Antwort
von vagabond3, 106

welche regEx benutzt du denn, mit welchem programm arbeitest du?

Kommentar von Boarschdi ,

PCRE RegEx, als Shellscript Linux

Antwort
von PWolff, 69

Lass das String mit einem Ausdruck anfangen, der mit einer Pipe endet und sonst keine Pipes enthält und genau fünfmal wiederholt wird:

^(([^\|]*)\|){5}

gefolgt von dem gesuchten Ausdruck, der kein Pipe enthalten darf

([^\|]*)

gefolgt von einem Pipe

\|

also

^(([^\|]*)\|){5}([^\|]*)\|

Dann musst du noch herausfinden, welche Nummer der Ausdruck

([^\|]*)

hat und diesen verwenden.

Manche RegEx-Flavors ermöglichen es auch, Unterausdrücken einen Namen zuzuweisen.

Oder auch - weniger kompliziert aber länger -, du nimmst für den Anfang des Strings einfach 6 mal einen Ausdruck ohne Pipe gefolgt von jeweils genau einer Pipe:

^([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|

und schaust nach, welche Nummer der 6. Ausdruck

([^\|]*)

hat (vermutlich Nr. 6, also in der Auswertung zugreifbar über

\6

)

Kommentar von PWolff ,
Kommentar von TeeTier ,

Ich glaube, dem Fragensteller gings um die Shell, vermutlich in Zusammenhang mit grep.

Und grep unterstützt weder Matching-Groups, noch dynamisches Look-Around. Man könnte aber mit sed arbeiten, wobei ich diese Lösung nicht gerade als schön erachten würde. (da zu viel Rumgeschubse im Speicher für so eine triviale Aufgabe)

Ich denke, awk ist wie geschaffen, für das Problem des Fragestellers. :)

Bei Java, Python, Perl, Ruby, PHP oder C++ usw. würde ich es aber auch genau so machen, wie du geschrieben hast. :)

Kommentar von PWolff ,

Ich verwende RegExes meist in C#, daher meine Antwort.

Und ich stimme mit dir völlig darin überein, dass ein einfacher Parser für zeichengetrennte Strings dem Problem wesentlich angemessener ist als die doch recht klobige Keule RegEx.

Antwort
von Roderic, 58

In deinem Beispiel steht er aber zwischen dem 7. und 8. Pipezeichen.

Besser ist, du suchst nach dem Ausdruck, der zwischen jeweils genau 3 Pipes steht.

Kommentar von TeeTier ,

Vermutlich steht zwischen den Pipes in anderen - in der Frage nicht aufgeführten - Zeilen noch weiterer Text.

Wenn es hingegen wirklich NUR um diese eine EINZIGE Zeile geht, würde ich zu Folgendem tendieren:

echo TESTEVENT

Das ist zumindest schön übersichtlich und kommt ohne RegEx aus. Leider nicht so flexibel, aber naja ... :)

Keine passende Antwort gefunden?

Fragen Sie die Community