2008-09-17 14 views
2

Gibt es eine kanonische Reihenfolge der Submatch Ausdrücke in einem regulären Ausdruck?Nummerierung Regex Submatches

Zum Beispiel: Wie lautet die Reihenfolge der Unterübereinstimmungen in
"([0-9] {3}). ([0-9] {3}). ([0-9] {3}). ([0-9] {3})) \ s + ([AZ] +) "?

a. (([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{3}))\s+([A-Z]+) 
    (([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{3})) 
    ([A-Z]+) 
    ([0-9]{3}) 
    ([0-9]{3}) 
    ([0-9]{3}) 
    ([0-9]{3}) 

b. (([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{3}))\s+([A-Z]+) 
    (([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{3})) 
    ([0-9]{3}) 
    ([0-9]{3}) 
    ([0-9]{3}) 
    ([0-9]{3}) 
    ([A-Z]+) 

oder

c. somthin' else. 

Antwort

4

Sie neigen dazu, in der Reihenfolge beginnen die Erfassung Pars nummeriert werden von links nach rechts. Daher Option b.

2

In Perl 5 regulären Ausdrücken, Antwort b ist korrekt. Submatch-Gruppierungen werden in der Reihenfolge der offenen Klammern gespeichert.

Viele andere reguläre Ausdrücke-Engines nehmen ihre Hinweise von Perl, aber Sie müssten einzelne Implementierungen nachsehen, um sicher zu sein. Ich würde das Buch Mastering Regular Expressions für ein tieferes Verständnis vorschlagen.

0

Sie zählen öffnende Klammern von links nach rechts. So wäre die Reihenfolge

(([0-9]{3}).([0-9]{3}).([0-9]{3}).([0-9]{3})) 
([0-9]{3}) 
([0-9]{3}) 
([0-9]{3}) 
([0-9]{3}) 
([A-Z]+) 

Zumindest das ist, was Perl tun würde. Andere Regex-Engines haben möglicherweise andere Regeln.

Verwandte Themen