Padrão de regex JavaScript concatenar com variável

92

Como criar um padrão regex que é concatenado com a variável, algo assim:

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

obrigado

Komang
fonte

Respostas:

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

\bem uma string literal é um caractere de retrocesso. Ao colocar uma regex em um literal de string, você precisa de mais uma rodada de escape:

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

(Você também não precisa do //neste contexto.)

bobince
fonte
16
Existem muitos lugares onde a função de construtor de um tipo integrado pode ser usada com ou sem new. No entanto, para consistência com outros objetos onde isso pode não ser verdade, e clareza em geral, eu sempre usaria new.
bobince
1
Outra maneira é usar aspas simples para maior clareza, para que você não precise escapar das barras invertidas:new RegExp('\b'+test+'\b');
IQAndreas
5
Você ainda precisa escapar das barras invertidas. As aspas simples não têm regras de escape diferentes para aspas duplas em JavaScript (ao contrário, digamos, do PHP).
bobince
Essa resposta também resolve a mesma questão ao tentar usar os operadores de borda em uma variável com as funções de regexing JS .match () e .replace ().
HoldOffHunger
É mesmo o que eu procurava. A parte sobre When putting a regex in a string literal you need one more round of escaping; há alguma informação de fundo sobre (as razões) isso?
Bas Peeters de
9

você pode usar

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

mas eu sugiro usar

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

Com ES2015 (também conhecido como ES6), você pode usar literais de modelo ao construir 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
fonte
3
erro tipográfico: Regexp deve ser RegExp
NFpeter