2016-03-28 17 views
1
pattern = /domain\.com\/go\/(.*)3/i; 

//alias always ends with "3" 
url1 = "domain.com/go/firstname3"; 
url2 = "domain.com/go/secondname3?p=123"; 

console.log(url1.match(pattern)[1]); //firstname 
console.log(url2.match(pattern)[1]); //secondname3?p=12 

In beiden Beispielen brauche ich Return-Parameter ohne "3" ("Vorname", "zweiter Name"). Es bedeutet, dass ich den ersten Eintrag von char "3" finden muss. Erstes Beispiel funktioniert korrektRegex erster Eintrag

Wie soll ich das Muster ändern?

Danke.

Antwort

4

Verwenden \w* statt .*

pattern = /domain\.com\/go\/(\w*)3/i; 

oder

pattern = /domain\.com\/go\/(\w*)3\b/i; 
1

Dies geschieht, weil Sie die Erfassungsgruppe wiederholen, und alle Sprachimplementierungen nur die letzte Erfassungsgruppe erhalten. Mit anderen Worten, wenn es eine Auswahl zwischen der Erfassung von secondname und secondname3?p=12 gibt, wählt Javascript die letzte, obwohl beide gleichermaßen gültig sind. This answer erklärt den Kern des Problems.

Der richtige Weg, um solche Probleme zu lösen, ist Ihre regex Gruppe neu zu schreiben, um den Parameter Sie eindeutig abrufen mögen zu machen - in der Regel dies durch eine Änderung Vorkommen von .* (man beachte es Charakter hier ist der ., die problematisch ist) durchgeführt wird, um etwas geeigneter, wie \w* in diesem Fall. Sie möchten vermeiden, Erfassungsgruppen zu wiederholen. Ich werde erklären, warum \w dies tut.

Hier steht \w für das Wort Metazeichen - es entspricht a-z, A-Z und 0-9 und sonst nichts. In diesem speziellen Fall kann die Regex nicht länger mit secondname3?p=12 übereinstimmen, da sie eine enthält, die von \w nicht erlaubt ist. Daher funktioniert die Lösung von @Avinash Raj - obwohl die einfangende Gruppe wiederholt wird, gibt es nur eine reale Instanz der gesamten Sache, die zusammenpasst.