JavaScript-Regex-Muster verketten mit Variable

91

So erstellen Sie ein Regex-Muster, das mit einer Variablen verknüpft ist:

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

Vielen Dank

Komang
quelle

Antworten:

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

\bin einem String-Literal ist ein Rücktaste. Wenn Sie einen regulären Ausdruck in ein Zeichenfolgenliteral einfügen, benötigen Sie eine weitere Escape-Runde:

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

(Das brauchen Sie //in diesem Zusammenhang auch nicht.)

Bobince
quelle
16
Es gibt viele Stellen, an denen die Konstruktorfunktion eines eingebauten Typs sowohl mit als auch ohne verwendet werden kann new. Aus Gründen der Konsistenz mit anderen Objekten, bei denen dies möglicherweise nicht zutrifft, und der Klarheit im Allgemeinen würde ich jedoch immer verwenden new.
Bobince
1
Eine andere Möglichkeit besteht darin, aus Gründen der Klarheit einfache Anführungszeichen zu verwenden, damit Sie den Schrägstrichen nicht entkommen müssen:new RegExp('\b'+test+'\b');
IQAndreas
5
Sie müssen immer noch den Backslashes entkommen. Einfache Anführungszeichen haben keine anderen Escape-Regeln als doppelte Anführungszeichen in JavaScript (im Gegensatz zu beispielsweise PHP).
Bobince
Diese Antwort löst auch die gleiche Frage, wenn versucht wird, die Rahmenoperatoren für eine Variable mit den JS-Regexing-Funktionen .match () und .replace () zu verwenden.
HoldOffHunger
Genau das, wonach ich gesucht habe. Der Teil über When putting a regex in a string literal you need one more round of escaping; Gibt es Hintergrundinformationen dazu (die Gründe dafür)?
Bas Peeters
9

Sie können verwenden

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

aber ich schlage vor zu verwenden

var list = '51,52,53';
function test2(list, test){
    return !((","+list+",").indexOf(","+test+",") === -1)
}
alert( test2(list,52) )
Lauri
quelle
9

Mit ES2015 (auch bekannt als ES6) können Sie beim Erstellen von RegExp Vorlagenliterale verwenden :

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))

Tapirboy
quelle
3
Tippfehler: Regexp muss RegExp
NFpeter