3 Stimmen

Regulärer Ausdruck Wiederholung: Wie können Ausdrücke unterschiedlicher Längen übereinstimmen?

Im Grunde genommen möchte ich Folgendes tun:

if ($expression =~ /^\d{num}\w{num}$/)
{
     #etwas tun
}

wo num nicht ein Identifier ist, sondern für eine beliebige ganze Zahl größer als 0 stehen könnte (\d und \w wurden willkürlich gewählt). Ich möchte einen String nur dann finden, wenn er zwei Gruppen von zusammenhängenden Zeichen enthält, wobei eine Gruppe unmittelbar auf die andere folgt und die Anzahl der Zeichen in jeder Gruppe gleich ist.

Für dieses Beispiel würden 123abc und 021202abcdef passen, aber 43abc würde nicht passen, ebenso wenig wie 12ab3c oder 1234acbcde.

6voto

Jon Purdy Punkte 51628

Denken Sie nicht daran, dass der String von links nach rechts wächst, sondern eher von außen nach innen:

xy
x(xy)y
xx(xy)yy

Ihr Regex würde dann ungefähr so aussehen:

/^(x(?1)?y)$/

Wo (?1) sich auf das äußere Paar von Klammern bezieht. ? macht es optional, um einen "Grundfall" für das rekursive Match zu geben. Dies ist wahrscheinlich das einfachste Beispiel dafür, wie Regexes verwendet werden können, um kontextfreie Grammatiken zu erkennen - obwohl es im Allgemeinen einfacher ist, dies mit einem Parser-Generator oder einer Parser-Kombinator-Bibliothek zu erreichen.

4voto

aschepler Punkte 68538

Nun, da ist

if ($expression =~ /^(\d+)([[:alpha:]]+)$/ && length($1)==length($2))
{
    #doSomething
}

Ein Regex ist nicht immer die beste Option.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X