2016-11-12 11 views
2

Die Ausgabe, die ich erwarte, dass 180 aus diesem zu bekommen, istCapturing Stringliterale optional regex

  1. SE 180, Einzelstudien, 08/24/16, 12/12/16, R MAK
  2. SE , Einzelstudien, 08/24/16, 12/12/16, H Katircioglu

aber wie Sie sehen können, manchmal, weil, wie die Datendatei umgewandelt wurde, ein unerwartetes (button) erscheint zwischen den ersten beiden Daten Felder.

Hier ist der Regex, den ich mir ausgedacht habe. Ich verstehe nicht, warum es nicht fängt. Ich hüpfte mit einer Reihe von Augen, die mir helfen würden, meinen Fehler zu verstehen. Ich bin noch neu in Regex, aber hier ist, was ich verstehe

In meinem Fall, um die Zeichenfolge Literal "(Schaltfläche)" erfassen, tippe ich \(button\). Für meine Daten endet das String-Literal immer mit einem Leerzeichen. Und ich möchte die ganze Gruppe von Daten optional machen. Daher lande ich bei (?:\(button\)\s?)?.

Regex Gebrauchte

https://regex101.com/r/88VDYN/1

([A-Z]+\s\S+)\s(?:\(button\)\s?)?([A-Z]+.+?)\s\d+\s\d+.+?(\d\d\/\d\d\/\d\d)-(\d\d\/\d\d\/\d\d)\s?(?:.*?([A-Z]\s[A-Z]+-*[A-Z]+))?\s 

Data Set

SE 180 INDIVIDUAL STUDIES 92 49321 3 SUP 73 P 1/90 F 0730-1020 08/24/16-12/12/16 ENG 189 R MAK 
SE 180 
(button) 
INDIVIDUAL STUDIES 90 49320 3 SUP 73 P 0/50 MW 1500-1615 08/24/16-12/12/16 ENG 337 H KATIRCIOGLU 

Antwort

3

Ihr Test-String tatsächlich mehr als ein Leerzeichen hat vor und nach den (button). Die eine ist eine Newline, die andere ist ein einfacher Raum.

Sie benötigen \s+ und \s* statt nur verwenden \s um Ihre (button):

([A-Z]+\s\S+)\s+(?:\(button\)\s*)?([A-Z]+.+?)\s\d+\s\d+.+?(\d\d\/\d\d\/\d\d)-(\d\d\/\d\d\/\d\d)\s?(?:.*?([A-Z]\s[A-Z]+-*[A-Z]+))?\s 
      ^   ^

Regex101 Demo

+0

Vielen Dank, mein Herr! Ich bin immer noch ziemlich neu in Regex, also nahm ich automatisch an, dass es eher ein Syntaxfehler meinerseits war, dann vermisse ich das Urteil über '\ n' und Whitespaces. Danke nochmal! –

-2

die ?: in Ihrem Muster entfernen. Das ist es, was es bricht.

([A-Z]+\s\S+)\s(\(button\)\s?)?([A-Z]+.+?)\s\d+\s\d+.+?(\d\d\/\d\d\/\d\d)-(\d\d\/\d\d\/\d\d)\s?(?:.*?([A-Z]\s[A-Z]+-*[A-Z]+))?\s

+0

https://regex101.com/r/heAj8F/1 ich es versucht und es dosent noch Arbeit, auch ich hatte das '?:' da drin, weil ich nicht wollte, dass die Daten dort eingefangen werden. Ist das nicht ein guter Weg, das zu tun? –

+0

Ich sehe Ihren zweiten Testfall Zeilenumbrüche vor und nach (Schaltfläche). Ist das in der Regel der Fall – dda