Il pattern regex JavaScript si concatena con la variabile


93

Come creare un pattern regex che è concatenato con la variabile, qualcosa del genere:

var test ="52";
var re = new RegExp("/\b"+test+"\b/"); 
alert('51,52,53'.match(re));

Grazie

Risposte:


149
var re = new RegExp("/\b"+test+"\b/"); 

\bin una stringa letterale è un carattere backspace. Quando si inserisce una regex in una stringa letterale è necessario un altro round di escape:

var re = new RegExp("\\b"+test+"\\b"); 

(Inoltre non è necessario //in questo contesto.)


16
Ci sono molti posti in cui la funzione costruttore di un tipo incorporato può essere usata sia con che senza new. Tuttavia, per coerenza con altri oggetti in cui ciò potrebbe non essere vero e per chiarezza in generale, lo userei sempre new.
bobince

1
Un altro modo è usare le virgolette singole per chiarezza in modo da non dover sfuggire alle barre new RegExp('\b'+test+'\b');
rovesciate

5
Hai ancora bisogno di sfuggire ai backslash. Le virgolette singole non hanno regole di escape diverse per le virgolette doppie in JavaScript (a differenza, ad esempio, di PHP).
bobince

Questa risposta risolve anche la stessa domanda quando si tenta di utilizzare gli operatori di confine su una variabile con le funzioni di regex JS .match () e .replace ().
HoldOffHunger

Proprio quello che stavo cercando. La parte su When putting a regex in a string literal you need one more round of escaping; ci sono informazioni di base su (le ragioni di) questo?
Bas Peeters

9

Puoi usare

/(^|,)52(,|$)/.test('51,52,53')

ma suggerisco di usare

var list = '51,52,53';
function test2(list, test){
    return !((","+list+",").indexOf(","+test+",") === -1)
}
alert( test2(list,52) )

9

Con ES2015 (aka ES6) è possibile utilizzare letterali del modello durante la costruzione RegExp :

let test = '53'
const regexp = new RegExp(`\\b${test}\\b`, 'gi') // showing how to pass optional flags
console.log('51, 52, 53, 54'.match(regexp))


3
errore di battitura: Regexp deve essere RegExp
NFpeter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.