2015-06-25 14 views
7

Ho provato a riscrivere il metodo (parte di tutorial su w3schools).Javascript: String.match() - passa la variabile stringa nell'espressione regolare

Il problema è creare una stringa variabile per diventare parte dell'espressione regolare.

Tutorial Codice di esempio:

function myFunction() { 
    var str = "The rain in SPAIN stays mainly in the plain"; 
    var res = str.match(/ain/gi); 
    console.log(res) 
} 

ho provato:

function myFunction() { 
    var str = "The rain in SPAIN stays mainly in the plain"; 
    var test = "ain"; 
    var re = "/"+test+"/gi"; 
    var res = str.match(re); 
    console.log(res); 
} 

Il modo in cui ho provato non ha funzionato.

risposta

11

utilizzare il costruttore regex, come:

function myFunction() { 
    var str = "The rain in SPAIN stays mainly in the plain", 
     test = "ain", 
     re = new RegExp(test, 'gi'), 
     res = str.match(re); 

    console.log(res); 
} 
7

È necessario utilizzare RegExp costruttore se si desidera passare un valore di variabile come regex.

Se la variabile contiene caratteri speciali, è meglio sfuggire a quelli.

var re = new RegExp(test.replace(/(\W)/g, "\\$1"), "gi"); 
5

match() non funziona con le stringhe

È possibile utilizzare var re = new RegExp(test,"gi");

var str = "The rain in SPAIN stays mainly in the plain"; 
    var test = "ain"; 
    var re = new RegExp(test,"gi"); 
    var res = str.match(re); 
    console.log(res); 
5

Potreste Hai cercato per "espressioni regolari dinamiche" e si sarebbe trovato: Javascript Regexp dynamic generation from variables? o Use dynamic (variable) string as regex pattern in JavaScript che entrambi descrivono molto bene.

+2

Questo dovrebbe essere un commento, non una risposta. O forse questa domanda dovrebbe essere contrassegnata come una copia di una delle risposte collegate? – RobG

+0

Non ho idea di come questo possa essere fatto. Se me lo dici, lo farò per i prossimi duplicati che vedo. Ma la maggior parte delle volte in cui vedevo altri duplicati, la gente rispondeva come "risposta" come se fosse la risposta al problema. – eX0du5

+0

@ eX0du5 Potresti averlo visto, ma non è così che funziona :) Se hai abbastanza rep, puoi vedere un'opzione "Chiudi".Se non lo fai, lascia un commento spiegando che è un duplicato e qualcuno con un rappresentante sufficiente voterà per chiudere per te – CodingIntrigue

5

Si noti che si passa una stringa a match. Se seguiamo lo documentation, questo farà un new RegExp(test). Pertanto, è necessario evitare le stringhe / e /gi e aggiungere flag corrispondenti al costruttore RegExp: il costruttore predefinito non aggiunge né ricerca globale (g) né ricerca maiuscole/minuscole (i).

Quindi la soluzione al vostro problema:

var str = "The rain in SPAIN stays mainly in the plain"; 
var test = "ain"; 
var res = str.match(new RegExp(test, "gi")); 

Ciò restituisce:

Array [ "ain", "AIN", "ain", "ain" ] 

Nota:

Il modulo solo str.match(test, "gi"); opere nel browser Firefox, ma è deprecato e getta una console avviso da Firefox 39 (vedi commento RGraham).

+0

Questo non passerà i flag 'gi' al costruttore' RegExp', secondo i documenti collegati. Passa 'g' di default, ma non' i' – CodingIntrigue

+0

@RGraham questo è il motivo per cui ho passato '" gi "' a 'str.match'. Se non lo passiamo, il risultato è solo 'Array [" ain "]': nessuna ricerca globale e nessuna ricerca insensibile alle maiuscole/minuscole. Quindi, per impostazione predefinita, non viene passato nulla al costruttore 'RegExp'. – TrapII

+1

Nessun sovraccarico per 'String.prototype.match' che accetta 2 argomenti. Almeno nelle specifiche e nell'implementazione di Chrome. Il tuo codice risulta in 'Array [" ain "]' su Chrome 42 – CodingIntrigue

Problemi correlati