Patrón de expresiones regulares de JavaScript concatenar con variable


94

Cómo crear un patrón de expresiones regulares que se concatena con una variable, algo como esto:

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

Gracias

Respuestas:


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

\ben un literal de cadena es un carácter de retroceso. Al poner una expresión regular en un literal de cadena, necesita una ronda más de escape:

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

(Tampoco es necesario //en este contexto).


16
Hay muchos lugares donde la función de constructor de un tipo incorporado se puede usar con o sin new. Sin embargo, por coherencia con otros objetos donde esto puede no ser cierto, y claridad en general, siempre usaría new.
Bobince

1
Otra forma es usar comillas simples para mayor claridad para que no necesite escapar de las barras diagonales new RegExp('\b'+test+'\b');
inversas

5
Aún necesitas escapar de las barras invertidas. Las comillas simples no tienen diferentes reglas de escape para las comillas dobles en JavaScript (a diferencia de, digamos, PHP).
Bobince el

Esta respuesta también resuelve la misma pregunta al intentar usar los operadores de borde en una variable con las funciones de expresión regular JS .match () y .replace ().
HoldOffHunger

Justo lo que estaba buscando. La parte sobre When putting a regex in a string literal you need one more round of escaping; ¿Existe alguna información de fondo sobre (las razones de) esto?
Bas Peeters

10

Con ES2015 (también conocido como ES6) puede utilizar literales de plantilla al 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
error tipográfico: Regexp debe ser RegExp
NFpeter

9

puedes usar

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

pero sugiero usar

var list = '51,52,53';
function test2(list, test){
    return !((","+list+",").indexOf(","+test+",") === -1)
}
alert( test2(list,52) )
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.