2017-10-26 6 views
0

Das ist mein regex Code ist:Regex passt zweites Vorkommen. Ich brauche es erste Auftreten paßt

.*(X.*)\s(.*?)\$ 

Dies ist mein Datenstring:

1247.P1.06.Z01.0020N.X396X111.Y008 1247.P1.06.Z01.0020N$M234477$ 

Dieses richtig ist, das zweite Element greifen, die mit dem ersten $ -Zeichen endet:

1247.P1.06.Z01.0020N 

Aber für die erste Saite, will ich es packen:

X396X111.Y008 

Stattdessen wird Grabbing:

X111.Y008 

So will ich es das erste X und alles bis zum Platz zu bekommen. Aber die zweite X löst die Übereinstimmung aus.

Der String mit „X“ beginnt, ist immer 13 Zeichen, so habe ich versucht, die Länge spezifiziert, aber es immer noch mit dem zweiten X

Ich bin gut mit entweder Muster gestartet:

  • Beginnen Sie mit der erstes X und end mit dem Leerzeichen.
  • Beginnen Sie mit dem ersten X und greifen Sie 13 Zeichen.

Vielen Dank.

Antwort

2

Befreien Sie sich von .* am Anfang des regulären Ausdrucks. Es ist gierig, also überspringt es den längsten möglichen Präfix, der dem Rest des regulären Ausdrucks entspricht. Das zwingt den Rest, das letzte Vorkommen anstelle des ersten zu bekommen.

DEMO

Im Allgemeinen ist es nicht notwendig, .* zu Beginn Ende eines regulären Ausdrucks zu setzen. Es sucht nur nach dem Muster irgendwo in der Eingabe, so dass Zeug um die Übereinstimmung ignoriert wird.

+0

Danke. Dieses Muster löste auch das Problem: https://regex101.com/r/FcrmpV/2 – Karl

+0

Das ist im Wesentlichen das Gleiche, da '. *?' Macht es das kürzeste Präfix anstelle des längsten Präfix übereinstimmen. Aber es ist immer noch völlig unnötig. – Barmar

1

Ihr Spiel ist zu locker. Eine strengere regex könnte sein:

X\S+\s 

die Spiele ein X, dann jede nicht Leerzeichen, bis ein Leerzeichen.

Demo: https://regex101.com/r/Jl2BJS/2/

Wenn die ID immer 13 Zeichen sind, können Sie tun:

X.{13} 

Demo: https://regex101.com/r/Jl2BJS/3/

Entfernen Alternativ die .*, oder es nicht gierig mit ? oder der Herstellung von U Modifikator würde auch funktionieren.

Demo: https://regex101.com/r/Jl2BJS/4/ oder https://regex101.com/r/Jl2BJS/5/

Verwandte Themen