Шаблон регулярного виразу 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.