2016-07-29 28 views
1

Ich möchte einen MARC-Datensatz mit einem regulären Ausdruck analysieren und das Feld als die erste erfasste Gruppe und den Wert als die zweite erfasste Gruppe zurückgeben. Hier ist, was ich bisher für die regex bekam:Wie kann ich MARC-Datensätze mit einem regulären Ausdruck analysieren?

(\n[0-9]{3})[ 0-9]{4}([^\n]*) 

Die letzte Capture-Gruppe dort ([^\n]*) ist die Erfassung alles bis zum nächsten Zeilenumbruch, die mit Linien große Werke wie:

001 868229892 
100 1 Montgomery, L. M.|q(Lucy Maud),|d1874-1942.,|eauthor. 
245 10 Anne of Green Gables /|cL.M. Montgomery. 
250 Aladdin hardcover edition. 
264 1 New York :|bAladdin,|c2014. 
300 440 pages &#59;|c22 cm 
336 text|2rdacontent. 
337 unmediated|2rdamedia. 
338 volume|2rdacarrier. 

jedoch , wenn es um Werte geht, die über die Leitungen brechen, die Regex nicht mehr funktioniert:

520 Anne, an eleven-year-old orphan, is sent by mistake to 
     live with a lonely, middle-aged brother and sister on a 
     Prince Edward Island farm and proceeds to make an 
     indelible impression on everyone around her. 
650 0 Shirley, Anne (Fictitious character)|vJuvenile fiction. 

die nächste Station Bereich sollte die 650 oben sein . Der Regex sollte also alles bis einen Zeilenumbruch gefolgt von 3 Ziffern erfassen.

Ich habe versucht, ([^\n0-9]*), aber das ist so interpretiert, als ob alles andere als Ziffern oder ein Zeilenumbruch in beliebiger Reihenfolge. Ich brauche es, um einen Zeilenumbruch und 3 Ziffern in dieser genauen Reihenfolge.

Antwort

1

Dies diese Regex, wie auf regex101 demonstriert:

(\n[0-9]{3})[ 0-9]{4}([^\n]+(?:\n\s+[^\n]+)*)

Die Capture-Gruppe ([^\n]+(?:\n\s+[^\n]+)*) Streichhölzer

  • alle Nicht-Zeilenumbrüchen: [^\n]+
  • dann eine beliebige Anzahl von zusätzlichen Linien: (?:\n\s+[^\n]+)*
0

Fügen Sie ein negatives Lookahead zum Ende hinzu, um sicherzustellen, dass der Zeilenumbruch von 3 Ziffern gefolgt wird. Es gibt auch ein paar Dinge, die getan werden könnten, um den regulären Ausdruck zu verkürzen.

(\n\d{3})[ \d]{4}((?:(?!\n\d{3}).)*) 
+0

Es funktioniert nicht. – JakeParis

+0

Funktioniert gut auf regex101. – RamenChef