2017-06-15 5 views
2

Ich habe einen numerischen Code, der 6 bis 11 Stellen lang variiertInsert Bindestrich wenn regex Gruppe nicht null oder leer ist

die durch Bindestrich nach jeweils 3 Ziffern getrennt ist

mögliche Kombinationen

123-456

123-456-78

123-456-7890

Also, hier versuche ich, den Benutzer eingegebenen Code in dieses Format zu konvertieren, auch wenn mit Leerzeichen und Bindestriche in der Mitte eingegeben.

Für Ex:

123 456-7 -> 123-456-7 

    123456 789 -> 123-456-789 

    123456 -> 123-456 

Gültige Benutzer-Eingabeformat ist 3digits [Leerzeichen oder Bindestrich] 3digits [Leerzeichen oder Bindestrich] 0to5digits

ich es wie folgt Aber

code.replace(/^(\d{3})[- ]?(\d{3})[- ]?(\d{0,5})$/,'$1-$2-$3'); 

versucht, wenn Da es nur 6 Ziffern gibt, gibt es am Ende der Nummer einen Bindestrich (-), der nicht erwünscht ist.

123-456- 

Konnte mir jemand dabei helfen? Vielen Dank.

+0

Sollte es möglicherweise 6-10 Ziffern sein? – ClasG

+0

@ClasG Sein Minimum von 6 und Maximum von 11 – user3066006

+0

3 + 3 + 4 macht 10 zu mir ... Wo ist die elfte Stelle? – ClasG

Antwort

1

Ich glaube, das wird ich tun t für Sie - ersetzen

^(\d{3})[ -]?()|(\d{3})[ -]?(\d{1,5}) 

mit

$1$3-$2$4 

Es hat zwei Abwechslungen.

  1. ^(\d{3})[ -]?() Spiele von Zeile beginnen und erfaßt dann die erste Gruppe von drei Ziffern ($ 1), dann gegebenenfalls gefolgt von einem Raum oder einem Bindestrich. Schließlich erfasst es eine leere Gruppe ($ 2).
  2. (\d{3})[ -]?(\d{1,5}) entspricht und erfasst ($ 3), drei Ziffern, optional gefolgt von einem Leerzeichen oder einem Bindestrich.Dann stimmt es die restlichen 1-5 Ziffern ab und fängt (($ 4)) ein, wenn sie vorhanden sind.

Da die globale Flag gesetzt ist, wird es eine oder zwei Iterationen für jede Folge von Ziffern machen. Die erste wird der ersten Änderung entsprechen und die ersten drei Ziffern in Gruppe 1 aufnehmen. Gruppe 2 ist leer.

Für die zweite Iteration das erste Spiel haben die ersten drei Zahlen angepasst, so dass dieses Mal der zweite Wechsel wird der verbleibende in den nächsten drei Stellen in Gruppe 3 und dann die Gruppe 4.

Hinweis passen und erfassen! Wenn nach der ersten Übereinstimmung nur noch drei Ziffern übrig sind, stimmt keine der Alternativen überein, und die letzten drei Ziffern bleiben unverändert.

Also bei der ersten Iteration Gruppe 1 sind Ziffern 123. Gruppe 2, 3 und 4 sind leer. Die zweite Iterationsgruppe 1 und zwei sind leer, Gruppe 3 sind die Ziffern 456 und Gruppe 4 sind Ziffern 7-11.

Dies gibt die erste ersetzen $ 1 = 123- plus nichts, und die zweite 456-67....

Es gibt keine Syntaxprüfung in diesem obwohl. Es geht davon aus, dass die Ziffern so eingegeben wurden, wie Sie es angegeben haben.

See it here at regex101.

2

Der einfachste Weg ist wahrscheinlich nur dies zu tun, mit einer zweiten replace:

code.replace(/^(\d{3})[- ]?(\d{3})[- ]?(\d{0,4})$/,'$1-$2-$3') 
    .replace(/-$/, ''); 

Dies ist ein zweites Ersetzen-Funktion Verkettungs, die sagen „ein - am Ende der Schnur mit einem leeren String ersetzen“ . . Oder mit anderen Worten, „wenn das letzte Zeichen der Zeichenfolge - dann lösche

Ich finde diesen Ansatz intuitiver als zu versuchen, diese Logik alle in einen replace Befehl zu passen, aber das ist auch möglich:

code.replace(
    /^(\d{3})[- ]?(\d{3})[- ]?(\d{0,4})$/, 
    '$1-$2' + ($3 == null ? '' : '-') + $3 
) 

Ich denke, es ist weniger offensichtlich auf einen Blick, was dieser Code ich tue, aber das Nettoergebnis ist das gleiche.Wenn es keine $3 übereinstimmte (dh Ihr Stich nur 6 Ziffern enthalten), dann schließen Sie nicht die endgültige in der Ersatz

+0

Ja das funktioniert definitiv, danke. Aber ich bin nur neugierig, wie es geht. – user3066006

+0

Schön gemacht Tom, wären Sie in der Lage, eine kurze Erklärung hinzuzufügen, wo das OP schief gelaufen ist und was Ihr Code tut, um es zu lösen? – evolutionxbox

+1

@evolutionxbox Ich habe die Antwort aktualisiert. –

Verwandte Themen