2016-11-24 1 views
1

KonzeptRegulärer Ausdruck mit mehrere Gruppierungsbedingung

Example: 0232699980132 
0 232 699980132 
0 - segment 1 
232 - segment 2 (length = 3) 
699980132 - segment 3 (length = 9) 
Length of segment 2 and 3 should be 12 or 13 

Th Beispiel hat 3 Segmente kann erstes Segment 0 oder 24 oder 0024. zweites Segment 232 oder seine Dose 123 oder 3434. Die dritte Segment kann eine beliebige sein, Zahl aber Kombination von 2. und 3. Segment sollte 12 oder 13

ich versuchte

/[?:0|24|0024]{1,3}[232|123|3434]{3,4}[0-9]{9}$/ 

Problem sein: Es funktioniert, wenn ich dritten Segment beheben 9 bis min, aber ich

Ich habe versucht, auch Gruppen zu machen, aber es ist in Unordnung alle

/[?:0|24|0024]{1,3}([232|123|3434]{3,4}[0-9])(?=.{14}$)$/ 

Bitte geben Sie müssen 2. und 3. Segment 12 oder 13 begrenzen.

https://jsfiddle.net/ohz7nnz7/

+0

Versuchen Konstrukte Gruppierung, '(. ..) ', anstelle von Zeichenklassen,' [...] '. Siehe ['^ (0 | 24 | 0024) (232 | 123 | 3434) ([0-9] {9}) $'] (https://regex101.com/r/JBMh4t/1) –

+0

, jeder Wert von Segment 2 wäre ein separates Konstrukt? – Mac

+0

Wie berechnet man, ob die Länge von Segment 2 und Segment 3 12 oder 13 ist? – Mac

Antwort

1

Ich schlage 2 verschiedene Muster verwendet wird, eine für die Prüfung und ein anderes für das Extrahieren.

var patt_test = /^(0024|24|0)(232[0-9]{9,10}|123[0-9]{9,10}|3434[0-9]{9})$/; 

Dieser wird sicherstellen, dass wir nur qualifizierende Strings zuordnen. Details:

  • ^ -start Schnur
  • (0024|24|0) - Gruppe 1 (kein Zeichenklasse wie in Ihrer Frage!) Passend 0024, 24 oder 0 (als ((?:00)?24|0) gekürzt werden)
  • (232[0-9]{9,10}|123[0-9]{9,10}|3434[0-9]{9}) - Gruppe 2 Capturing:
    • 232[0-9]{9,10} - 232 Nummer und dann 9 oder 10 Ziffern
    • 123[0-9]{9,10} - 123 Nummer und dann 9 oder 10 Ziffern
    • 3434[0-9]{9} - 3434 Nummer und dann 9 Ziffern
  • $ - Ende der Schnur.

Sobald die Zeichenfolge auf diese Weise bestätigt wird, gehen wir mit den 3 Teilen zu extrahieren:

var patt_extract = /^(0024|24|0)(232|123|3434)(\d{9,10})$/; 

Details:

  • ^(0024|24|0) - 0024, 24 oder 0 zu Beginn der Zeichenkette
  • (232|123|3434) - Gruppe 2 Erfassung 232, 123 oder 3434literal char Sequenzen
  • (\d{9,10}) - Gruppe 3: alle 9 bis 10 Digits
  • $ - Ende der Zeichenfolge

var number = []; 
 
number[0] = "0232699980132"; // this should be true as starts with 0 
 
number[1] = "008973343430145"; // false 
 
number[2] = "24232667870167"; // true 
 
number[3] = "0024232656880187"; // true 
 
number[4] = "024232623432190"; // this should be false because middle segment 24 is not allowed 
 
number[5] = "02326568801878"; // this should be true 
 

 
console.clear(); 
 
var patt_test = /^(0024|24|0)(232[0-9]{9,10}|123[0-9]{9,10}|3434[0-9]{9})$/; 
 
var patt_extract = /^(0024|24|0)(232|123|3434)(\d{9,10})$/; 
 
var result = false; 
 
for(i=0; i<=(number.length-1); i++) { 
 
\t result = patt_test.test(number[i]); 
 
    if (result) { // VALIDATE THE STRING 
 
    \t var first, second, third; 
 
    \t var m = patt_extract.exec(number[i]); // EXTRACT PARTS 
 
    \t if (m) { first = m[1]; second = m[2]; third = m[3]; } 
 
    \t var str = number[i]+" -- "+result+"--"+number[i].length+"--P1:"+first+"--P2:"+second+"--P3:"+third; 
 
    \t console.log(str); 
 
    } else { 
 
    console.log(number[i]+" -- "+result+"--"+number[i].length); 
 
    } 
 
}

0

, wie etwa:

^(?:0024|24|0)(?=(?:232|123)\d{10}$)(?=3434(?:\d{9})$) 

oder

^(?:0024|24|0)(?:(?:232|123)\d{10}|3434(?:\d{9}))$ 
+0

Nein, es funktioniert nicht. https://jsfiddle.net/ohz7nnz7/2/ – Mac

+0

Gibt es trotzdem die Länge von Segment 2 und Segment 3 zu bekommen? – Mac