2016-05-10 10 views
1

Ich muss eine Reihe von Ziffern in Stücke von drei brechen, aber ich kann nicht zulassen, dass ein Stück nur eine Ziffer enthält, muss es mindestens zwei enthalten .Break String in Stücke von drei, aber mit einer Mindestanzahl von zwei

Zum Beispiel

[123],[456],[7] - ist dies nicht akzeptabel, weil 7 allein gelassen wird, auf seine

[123],[45],[67] - das ist die akzeptable Lösung

Ich habe es fast geschafft habe, aber ich bin nicht sicher, wie man damit umgeht, dass es mindestens zwei Ziffern gibt.

Hier ist meine Lösung, die die Zeichenfolge in drei Teile bricht aber für mindestens einstellige Zählung nicht berücksichtigt:

function solution(s) { 
    var number = s.replace(/\D/g, ''); 
    number = number.match(/.{1,3}/g); // breaks down into threes 
    number = number.join('-'); 
    return number; 
} 

hier ein, ihn in Aktion zu sehen ist codepen: http://codepen.io/franhaselden/pen/mPobNb

Antwort

2

Sie kann einen Regex mit Lookahead verwenden.

Die Positive Lookahead sucht nach dem Gleichheitszeichen, aber nicht in der Übereinstimmung.

x (? = Y)

Spielen 'x' nur dann, wenn 'x' durch 'y' gefolgt. Dies nennt man Lookahead.

Zum Beispiel passt /Jack(?=Sprat)/ "Jack" nur, wenn es von "Sprat" gefolgt wird. /Jack(?=Sprat|Frost)/ passt "Jack" nur, wenn "Sprat" oder "Frost" folgt. Weder "Sprat" noch "Frost" gehören jedoch zu den Ergebnissen des Spiels.

Online RegEx

function format(s) { 
 
    return s.toString().replace(/\d{2,3}(?=..)/g, '$&-'); 
 
} 
 

 
document.write(format(123456789) + '<br>'); 
 
document.write(format(12345678901) + '<br>'); 
 
document.write(format(1234567) + '<br>');

bearbeiten

Während ich finde nicht, dass eine zusätzliche Schleife über ein Array notwendig ist, dieser Vorschlag gibt Ihnen den gewünschten Schritt mit String#match() um später das Array mit dem folgenden regulären Ausdruck zu verbinden:

/.{2,3}(?=..)|.+/g

  • 1st Alternative: .{2,3}(?=..)

    • .{2,3}jedes Zeichen (außer Newline)
      Quantifier:{2,3} Zwischen 2 und 3-mal, so oft wie möglich, je nach Bedarf [greedy]

    • (?=..)positive Vorschau etwas zurückzugeben - Behaupten, dass der Regex unten kann
      . jedes Zeichen (außer Newline) angepasst wird
      . jedes Zeichen (außer newline)

  • 2nd Alternative: .+

    • .+jedes Zeichen (außer Newline)
      Quantifier:+ Zwischen one und unlimited mal, so oft wie möglich, so dass je nach Bedarf zurück [greedy]
  • g modifier: global. Alle Spiele (nicht zurück auf erstem Spiel)

var a, i, s = ''; 
 

 
for (i = 1; i < 10; i++) { 
 
    s += i; 
 
    a = s.match(/.{2,3}(?=..)|.+/g); 
 
    document.write(a.join('-') + '<br>'); 
 
}

+0

Dank, können Sie diese brechen, um nur den Teil nach unten, die dem Look-Ahead-Griffen? Ähnlich wie ich es in drei verschiedene Linien unterteilt habe. Es macht es einfach für mich zu lernen, als alles zusammen zu sehen. – user1486133

+0

Auch ich habe Ihre Lösung versucht, und es entfernt die letzten zwei Zahlen der Zeichenfolge, die nicht richtig ist. Alle Zahlen müssen enthalten sein: http://codepen.io/franhaselden/pen/mPobNb – user1486133

+0

Sie verwenden 'match' anstelle von' replace', wie mein Vorschlag oben. 'match' gibt nur den übereinstimmenden Teil zurück, ohne den Rest. in Ihrem Fall würde ich es in einem Schritt mit 'ersetzen 'tun. –