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

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.)


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) )

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))


3
typo: Regexp doit être RegExp
NFpeter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.