Шаблон регулярного виразу JavaScript об'єднується зі змінною


93

Як створити шаблон регулярного виразу, який поєднується зі змінною, приблизно так:

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

Дякую

Відповіді:


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