Concaténation du modèle d'expression régulière JavaScript avec une variable

93

Comment créer un motif regex qui est concaténé avec une variable, quelque chose comme ceci:

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

Merci

Komang
la source

Réponses:

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

\bdans une chaîne littérale est un caractère de retour arrière. Lorsque vous placez une expression régulière dans une chaîne littérale, vous avez besoin d'un autre cycle d'échappement:

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

(Vous n'avez pas non plus besoin du //dans ce contexte.)

bobince
la source
16
Il existe de nombreux endroits où la fonction constructeur d'un type intégré peut être utilisée avec ou sans new. Cependant, pour la cohérence avec d'autres objets où cela peut ne pas être vrai, et pour la clarté en général, j'utiliserais toujours new.
bobince
1
Une autre façon est d'utiliser des guillemets simples pour plus de clarté afin que vous n'ayez pas besoin d'échapper aux barres obliques inverses:new RegExp('\b'+test+'\b');
IQAndreas
5
Vous devez toujours éviter les contre-obliques. Les guillemets simples n'ont pas de règles d'échappement différentes des guillemets doubles en JavaScript (contrairement, par exemple, à PHP).
bobince
Cette réponse résout également la même question lorsque vous essayez d'utiliser les opérateurs de bordure sur une variable avec les fonctions de regexing JS .match () et .replace ().
HoldOffHunger
Exactement ce que je cherchais. La partie sur When putting a regex in a string literal you need one more round of escaping; y a-t-il des informations générales sur (les raisons de) cela?
Bas Peeters
9

vous pouvez utiliser

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

mais je suggère d'utiliser

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

Avec ES2015 (aka ES6), vous pouvez utiliser des littéraux de modèle lors de la construction de 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))

Tapirboy
la source
3
typo: Regexp doit être RegExp
NFpeter