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.