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

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


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

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


3
erro tipográfico: Regexp deve ser RegExp
— NFpeter
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.