2014-09-07 19 views
5

Ich versuche zu testen, ob eine ungeordnete Zeichenfolge "3" in 5 Mal hat oder nicht.Javascript Regex - bestimmte Anzahl von Zeichen in ungeordneter Zeichenfolge

Zum Beispiel:

var re = /3{5}/; 
re.test("333334"); //returns true as expected 
re.test("334333"); //returns false since there is no chain of 5 3s 

Welche regex wäre die zweite Zeile true zurück zu machen? Wenn Regex nicht der beste Weg ist, das zu testen, was ist das?

Danke!

Antwort

6

Versuchen

(str.match(/3/g) || []).length >= 5 

Oder

str.split(3).length > 5 

Wo str ist die Zeichenfolge, die Sie testen möchten.

+2

Der Split ist eine gute Idee. –

+0

Es sollte 'str.split ('3')' (mit den Anführungszeichen) sein. Für dich behoben. –

+1

@SashaChedygov Zitate sind nicht notwendig. Aus [ES5 spec Abschnitt 15.5.4.14] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.5.4.14), in Schritt 8, "* Wenn' separator' ist ein 'RegExp 'Objekt (seine' [[Klasse]] 'ist" RegExp "), lassen Sie' R = Trennzeichen '; sonst lassen Sie' R = ToString (Trennzeichen) '. *" – Oriol

3

Sie können schreiben:

var re = /(?:3[^3]*){5}/; 
+0

Hallo, ich bin neu in Regexp und habe Probleme, Capture-Klammern zu verstehen. Laut der MDN würde dies "3 [^ 3] *" entsprechen, aber nicht an die Übereinstimmung erinnern. Was genau bedeutet das? – Ativ

+1

@Ativ: Ja '(?: ...)' sind nicht einfangende Klammern. Das Ziel besteht nur darin, zu gruppieren, um den '{5}' Quantifizierer in Faktor zu setzen. Eine Erfassungsgruppe speichert den Inhalt, der später wiederverwendet werden soll (mit einer Rückreferenz). Aber es wird hier nicht benötigt. Wenn Sie eine nicht erfassende Gruppe verwenden, benötigen Sie offensichtlich weniger Speicher und sind ein wenig schneller. –

2

ich gehen würde, für

s.replace(/[^3]/,'').length >= 5 

Unter der Annahme, dass die Zeichenfolge getestet werden benannt s

0

Ich würde mit:

string.indexOf('33333') > -1 
Verwandte Themen