Шаблон регулярного выражения JavaScript объединяется с переменной


94

Как создать шаблон регулярного выражения, который объединяется с переменной, примерно так:

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

Благодарность

Ответы:


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

\bв строковом литерале - это символ возврата. При помещении регулярного выражения в строковый литерал вам понадобится еще один раунд экранирования:

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

//этом контексте вам также не нужен .)


16
Есть много мест, где функция-конструктор встроенного типа может использоваться как с, так и без new. Однако для согласованности с другими объектами, где это может быть неверно, и ясности в целом, я всегда буду использовать new.
bobince

1
Другой способ - использовать одинарные кавычки для ясности, чтобы вам не нужно было избегать обратных косых new RegExp('\b'+test+'\b');
черт

5
Вам все еще нужно избегать обратной косой черты. Одиночные кавычки не имеют других правил экранирования двойных кавычек в JavaScript (в отличие, скажем, от PHP).
bobince

Этот ответ также решает тот же вопрос при попытке использовать граничные операторы для переменной с функциями регулярного выражения JS .match () и .replace ().
HoldOffHunger

Именно то, что я искал. Часть о When putting a regex in a string literal you need one more round of escaping; есть ли какая-либо справочная информация об этом (причинах)?
Bas Peeters

10

В ES2015 (он же ES6) вы можете использовать шаблонные литералы при построении 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
опечатка: Regexp должен быть RegExp
NFpeter

9

ты можешь использовать

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

но я предлагаю использовать

var list = '51,52,53';
function test2(list, test){
    return !((","+list+",").indexOf(","+test+",") === -1)
}
alert( test2(list,52) )
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.