2015-05-20 12 views
6

Sto creando un'espressione regolare dinamicamente.Errore di sintassi delle espressioni regolari

var link = "www.google.com"; 
 
    var reg = '^'+link+'{1}|(?<=\s)'+link+'{1}(?=\s)|'+link+'{1}$'; 
 
    console.log(reg); 
 
    var result = new RegExp(reg, 'g');

sto ottenendo questo errore

Uncaught SyntaxError: Invalid regular expression: /^www.google.com{1}|(?<=s)www.google.com{1}(?=s)|www.google.com{1}$/: Invalid group 

Ecco l'espressione regolare generato:

^www.google.com{1}|(?<=s)www.google.com{1}(?=s)|www.google.com{1}$

+0

Hai usato qualche sintassi non JS? Ad esempio non riconosco '? <=' – mplungjan

+0

Perché il voto stretto ??? – mplungjan

+0

Assicura che il modello specificato corrisponda, finendo nella posizione corrente nell'espressione. Non consuma alcun personaggio. Es:/(? <= Foo) bar/Match: foobar – user3816152

risposta

1

JavaScript non supporta i gruppi lookbehind.

Per di più, la tua espressione regolare è costituita da stringhe. È necessario accertarsi che i metacaratteri delle espressioni regolari "sopravvivano" al processo di analisi costante della stringa e, in particolare, lo \s deve essere espresso come \\s.

Si noti inoltre che i caratteri . nella parte URL del pattern verranno interpretati come il simbolo "jolly" di espressioni regolari, se non li si precede con \\.

Infine, non è chiaro cosa ti aspetti da quelle {1} cose da fare; in JavaScript che corrisponderà alla sequenza di caratteri {1}.

+1

'{1}' è un quantificatore (anche se inutile). '/^m {1} $ /. test ('m')' restituisce 'true' (almeno in Firefox). –

+1

@FelixKling oh durr. Non ancora abbastanza caffè :) – Pointy

+0

Nessun problema :) Non sarebbe stato così sorprendente per me se '{1}' fosse trattato in modo diverso;) –

5

Il motore regex JavaScript non supporta gli elementi di visualizzazione per tutto. Un'altra cosa: è necessario eseguire il doppio escape \ all'interno del costruttore RegExp.

Quello che stai cercando di ottenere è di far coincidere l'URL con i confini delle parole.

Provare a utilizzare

RegExp.escape= function(s) { 
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
}; 

var reg = '\\b'+RegExp.escape(link)+'\\b'; 

Codice:

RegExp.escape= function(s) { 
 
     return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
 
    }; 
 

 
var link = "www.google.com" 
 
var reg = '\\b'+RegExp.escape(link)+'\\b'; 
 
alert(new RegExp(reg, "g"));

Nota sto aggiungendo il RegExp.Escape per sfuggire caratteri speciali negli argomenti passati al costruttore RegExp (ad es. . deve essere \\.).

+0

c'è qualche alternativa per look-behind in javascript ?? – user3816152

+0

io apprezzo il tuo aiuto .. Grazie. – user3816152

+0

[Ci sono alternative] (http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript), ma non ce ne sono nel caso in cui si abbia un numero indefinito di caratteri prima e dopo la stringa che si desidera abbinare. –