Wzorzec regex JavaScript łączy się ze zmienną


94

Jak stworzyć wzorzec wyrażenia regularnego, który jest konkatenowany ze zmienną, coś takiego:

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

Dzięki

Odpowiedzi:


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

\bw literale łańcuchowym to znak cofania. Umieszczając wyrażenie regularne w literale ciągu, potrzebujesz jeszcze jednej rundy ucieczki:

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

(W //tym kontekście również nie potrzebujesz ).


16
Istnieje wiele miejsc, w których funkcja konstruktora typu wbudowanego może być używana zarówno z, jak i bez new. Jednak dla spójności z innymi obiektami, w przypadku których może to nie być prawdą, i ogólnie dla przejrzystości, zawsze używałbym new.
bobince

1
Innym sposobem jest użycie pojedynczych cudzysłowów dla jasności, aby nie musieć uciekać przed ukośnikami:new RegExp('\b'+test+'\b');
IQAndreas

5
Nadal musisz uciec przed ukośnikami. Pojedyncze cudzysłowy nie mają innych reguł ucieczki od podwójnych cudzysłowów w JavaScript (w przeciwieństwie do, powiedzmy, PHP).
bobince

Ta odpowiedź również rozwiązuje to samo pytanie, gdy próbujesz użyć operatorów obramowania na zmiennej z funkcjami regexingowymi JS .match () i .replace ().
HoldOffHunger,

Właśnie tego szukałem. Część o When putting a regex in a string literal you need one more round of escaping; czy są jakieś podstawowe informacje na ten temat (przyczyny)?
Bas Peeters

10

W ES2015 (aka ES6) możesz używać literałów szablonów podczas konstruowania 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
literówka: Regexp musi być RegExp
NFpeter

9

możesz użyć

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

ale proponuję użyć

var list = '51,52,53';
function test2(list, test){
    return !((","+list+",").indexOf(","+test+",") === -1)
}
alert( test2(list,52) )
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.