2009-05-02 6 views
0

In der Vergangenheit war ich der Meinung, dass das Lat/Lon eines Flughafens musste auf der gleichen Linie sein (L 300216 0915302 '2425 29865997) mit 300216/0915302 ist der Lat/Lon. Ich habe gerade herausgefunden, dass die Benutzer das Lat/Lon auch auf andere Zeilen setzen können.Hilfe Verfeinern RegEx (" b d {6} ([] {1,15}) d {7} b")

I ARA         '* ACADIANA AIRPORT   29865996  
       L 300216        '2425  29865997  
        0915302        '2425  29865998  
       S MSY           29865999  
       M 05E           29866000  
       P 100 0300          29866001  
       P 239 3405          29866002  
       P 999 7001 O         29866003  

Wie kann ich meine RegEx zu stoppen durch ein L zwischen ohne Alphas mit vorangestelltem 7 Ziffern gefolgt alle 6 Ziffern ändern?

Danke!

+0

Meinst du, dass Alphas dazwischen nicht sein können oder Alphas dazwischen ignorieren können? –

+0

Sind die Teilstriche (') der Beginn von Kommentaren? Sind die Kommentare in der Eingabe enthalten, die Sie versuchen übereinzustimmen? – dustyburwell

Antwort

1

Wie zum Abgleichen

alle 6 von 7 Ziffern gefolgt Ziffern durch ein L voran ohne Alphas zwischen

Sie das Muster verwenden:

\bL\s*\d{6}\s*\d{7}\b 

Dies wird übereinstimmen

L (jede Menge von Leerzeichen) dddddd (jede Menge von Leerzeichen) ddddddd

von Grenzen umgeben sind. Wenn es um den Abgleich über mehrere Zeilen hinweg geht, ist dies normalerweise ein Flag, das Sie mit der von Ihnen verwendeten Regex-Engine festlegen können. Das \ s stimmt die Zeilenumbrüche gut ab, aber nur wenn Sie das Mehrzeilen-Flag gesetzt haben.

+0

"Das \ s wird den Zeilenumbrüchen gut gerecht, aber nur, wenn Sie das mehrzeilige Flag gesetzt haben." - Nein, \ s stimmt immer mit Zeilenumbrüchen überein.Das mehrzeilige Flag ändert das Verhalten der Anker^und $, und das einzeilige Flag lässt das Dot-Metazeichen mit Zeilenumbrüchen übereinstimmen. (Außer in Ruby, wo der mehrzeilige Modus derselbe ist, wie alle anderen den einzeiligen Modus nennen, und es gibt keinen "einzeiligen" Modifikator.) –

+0

Oh, hmmm ... Danke für die Rückmeldung. Um ehrlich zu sein, braucht mein Regexfu etwas Arbeit, zumindest wenn es darum geht, wie die Engine funktioniert und welche Flags wann gesetzt werden. – dustyburwell

0

Versuchen Sie Folgendes. Basierend auf Ihrer Zusammenfassung ich es jede Gruppe von 6 Ziffern entsprechen hatte, gefolgt von einem beliebigen Länge von Leerzeichen einschließlich neuen Linien, dann durch eine L und 7 Ziffern gefolgt

\d{6}[\s\n]*L\s*\d{7} 

ich die .Net Form von regulärem Ausdruck verwendet habe . Wenn Sie eine andere Engine verwenden, könnten Sie welche veröffentlichen? Dies funktioniert auch nur gegen den ASCII-Zeichensatz.

1

Ich sehe acht Ziffern in der rechten Spalte, nicht sieben. Betrachte ich das falsch? Ich denke also, die Frage ist nicht ganz so, wie die vorherigen Antworten zu antworten scheinen. Die sieben Ziffern sind tatsächlich in der nächsten Zeile.

Auch dies sieht für mich wie feste Spaltenausgabe aus, wenn Sie also die Anzahl der Spalten kennen, können Sie durch Verwendung von exakten Zahlen anstelle des * Modifikators eine signifikante Geschwindigkeit erzielen.

Also, wenn "x" ist die Anzahl der Spalten zwischen L und den 6 Ziffern und "L" ist in der ersten Spalte,

Text $ = ~ m/L \ s {x} (\ d {6}). * [\ R \ n] \ s \ s {x} (\ d {7})/

sieht aus als ob es übereinstimmen sollte. Ich bin mir nicht sicher, was sonst noch in der Datei sein könnte, aber es ist irgendwo zu beginnen.

$ 1 = erster Ziffernblock (6), $ 2 = 7 Ziffern in der nächsten Zeile. (unter Verwendung der Perl-Syntax, passen Sie wie erforderlich für andere Implementierungen an)

Verwandte Themen