2016-05-01 6 views
3

Hey also ich habe folgendes Skript, das funktioniert:Re-Factoring regulärer Ausdruck nicht leer Gruppen schließen

Es ist für die Zeichenfolge Phone: (##) ### ####

$(function(){ 

    var regex = /(^|\W)Phone:($|\W)\(?([0-9]{2})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/g; 
    var target = $('[data-hook="phone-number"]'); 
    var string = target.html(); 

    string = string.replace(regex, "><a href=\"tel:$3$5$6\">Phone: ($3) $5 $6</a>"); 

    target.html(string); 
}); 

Aber wie Sie es möglicherweise fest, sieht ziemlich rau ist (Regex ist nicht meine Stärke) Ich frage mich, gibt es eine Möglichkeit, leere Gruppen ($1, $2, $4) in diesem Fall zu ignorieren.

So kann ich einfach $1, $2, $3 in einer idealen Welt verwenden.

Auch kann ich nicht herausfinden, wie (^|\W) aus ignorieren das > Symbol zu stoppen, also warum in meinem replace ein nachläuft > ist es eine Möglichkeit, regex zu sagen, zu einer Nummer verschieben/entfernen?

+0

Wollen Sie immer ignorieren diese Gruppen? – Laurel

+0

Ja, es ist ziemlich spezifisch, also ist es in Ordnung, sie zu ignorieren. –

Antwort

3

Ich glaube, Sie suchen (?:), die eine nicht-einfangende Gruppe erstellt:

/(?:^|\W)Phone:(?:$|\W)\(?(?:[0-9]{2})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/g 

Wie Alan Moore sagte, können Sie es auch ein wenig verkürzen:

/\bPhone:\s*\(?(?:[0-9]{2})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/g 
+0

Danke :) !!! –

+0

Während Sie dabei sind, ändern Sie '(?:^| \ W)' in '\ b' und' (?: $ | \ W) 'in' \ s * '. –