RegEx string zwischen zwei Zeichen?

4 Antworten

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

)

Woher ich das weiß:Berufserfahrung – Software-Entwickler
TeeTier  25.01.2016, 15:57

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. :)

1
PWolff  25.01.2016, 16:09
@TeeTier

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.

0

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.

TeeTier  25.01.2016, 16:03

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 ... :)

0

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. :)

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

Boarschdi 
Fragesteller
 25.01.2016, 15:22

PCRE RegEx, als Shellscript Linux

0