Javascript Regex: Normal ifadenin içine bir değişken nasıl yerleştirilir?


207

Yani mesela:

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}

Ama bu elbette çalışmıyor :) Bunu yapmanın bir yolu var mı?


11
Kullanıcının bu değişkeni sağlamasına izin verirseniz, kötü niyetli bir kullanıcının uygulamanızı yıkıcı geri izleme yoluyla kilitlemesinin kolay olduğunu unutmayın.
Tim Pietzcker

2
"ReGeX" nedir? değişken bir isim mi? RegExp yapısının bir parçası olduğunu ima ederek cevaplar kafa karıştırır (bir okuyucunun bu garip karakterleri görmemesi durumunda).
Eduard

Yanıtlar:


273
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");

Güncelleme

Bazı yorumlar Başına, bu isteyebilirsiniz nota önemlidir kaçmak değişkeni (örneğin değişken kullanıcı girişi geliyor) zararlı içerik potansiyel varsa

ES6 Güncellemesi

2019'da bu genellikle bir şablon dizesi kullanılarak yazılır ve yukarıdaki kod güncellendi. Orijinal cevap:

var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");

5
İpinizden kaçtığınızdan emin olun! Cevap @zzzzBov
jtpereyda

Bu bir göz atın olabilir, benim durumumda çalışmıyor bu jsfiddle ve bana bildirin eğer ben ben içine ülke kodu dinamiğini ayarlamak isterseniz yapmanız gerekeni regexifade
Kirankumar Dafda

11
Hatırlanması gereken önemli bir nokta, normal karakter dizilerinde \ karakterinin, normal ifade değişmezinde (genellikle) / karakterinin kaçması gerektiğidir. Böylece /\w+\//iolurnew RegExp("\\w+/", "i")
Ali

3
/ G nasıl?
Qian Chen

Çocuklar, bu normal ifadeyi /[^0-9.- closeup/g dosyasını iki parçaya bölmem gerekiyor: / [^ 0-9 ve -] / g Nasıl yapılır?
en fazla

79

RegExp nesnesini kullanabilirsiniz:

var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);

O zaman istediğiniz şekilde inşa edebilirsiniz regexstring.

Burada daha fazla bilgi edinebilirsiniz .


var characterCount = parseInt (attrs.limitCharacterCount); console.log (characterCount); var specialCharactersValidation = yeni RegExp ("/ ^ [a-zA-Z0-9] {" + characterCount + "} $ /"); / \ / ^ [a-zA-Z0-9] {7} $ \ // requestShipmentDirectives.js: 76 false main.js: 46 Yakalanmayan TypeError: 'offsetWidth' özelliği okunamıyor null RegEx Dinamik.
Ankit Tanna

31

JavaScript'te bir değişkenden normal bir ifade oluşturmak için yapıcıyı RegExpbir string parametresiyle kullanmanız gerekir .

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

Tabii ki, bu çok naif bir örnek. inputDüzenli bir ifade için düzgün bir şekilde kaçıldığını varsayar . Kullanıcı girişi ile uğraşıyorsanız veya sadece özel karakterlerle eşleşmeyi daha uygun hale getirmek istiyorsanız, özel karakterlerden kaçmanız gerekir :

function regexEscape(str) {
    return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
}

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    input = regexEscape(input);
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

Bunun benim için çalışmasının tek yolu ReGeXmetni silmemdi. Bu yüzden kullandım:return new RegExp(input, flags);
Michael Rader

2
@MichaelRader, evet, "ReGeX" metni sorunun bir parçasıydı ve kodun çalışması için gerekli bir şey olarak değil, örnek olarak kullanıldı.
zzzzBov

1
lol sadece bu sadece yer tutucu olduğunu fark etti, ama bir noob olarak bu anlamaya biraz zaman aldı. Teşekkürler.
Michael Rader

Neden dize kaçması gerektiğini anlıyorum. Ama neden '\\ $ &' ​​yerine
geçiyor

2
\\tek bir \karakteri temsil eder $&, eşleşen alt dizedir .
zzzzBov

7

es6 şablon değişmezlerini kullanıyorsanız bir seçenektir ...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")

şablon değişmezleriyle çalışmaz. Benim app şifre doğrulamak için regexp kullanıyorum ve benim normal ifade dizesinde max ve min uzunluğu parametreleştirmek istedim ve çalışmıyor. `` const newRegExp = yeni RegExp ( ^[^\s]{${4},${32}}$); export const validatePassword = value => value.match (newRegExp); ``
p7adams

6

Her zaman dize olarak normal ifade verebilirsiniz, ör. "ReGeX" + testVar + "ReGeX" . Muhtemelen dizenizdeki bazı karakterlerden (örneğin çift tırnak) kaçmak zorunda kalacaksınız, ancak çoğu durumda eşdeğerdir.

Ayrıca RegExpyapıcıları bayrakları aktarmak için de kullanabilirsiniz ( belgelere bakın ).


5

JS'de iki yoldan biriyle normal ifadeler oluşturabilirsiniz:

  1. Normal ifade değişmezi kullanma - /ab{2}/g
  2. Normal ifade yapıcısını kullanma - new RegExp("ab{2}", "g").

Normal ifade değişmez değerleri sabittir ve değişkenlerle kullanılamaz. Bu, yapıcı kullanılarak gerçekleştirilebilir. RegEx yapıcısının yapısı

new RegExp(regularExpressionString, modifiersString)

Değişkenleri regularExpressionString öğesinin parçası olarak gömebilirsiniz. Örneğin,

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 

Bu, desenin herhangi bir görünümü ile eşleşecektir cdcdcd.


2

İşte belirli karakterler tarafından sarılmış değerleri döndüren oldukça işe yaramaz bir işlev. :)

jsfiddle: https://jsfiddle.net/squadjot/43agwo6x/

function getValsWrappedIn(str,c1,c2){
    var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g"); 
    return str.match(rg);
    }

var exampleStr = "Something (5) or some time (19) or maybe a (thingy)";
var results =  getValsWrappedIn(exampleStr,"(",")")

// Will return array ["5","19","thingy"]
console.log(results)

2

kabul edilen cevap benim için çalışmıyor ve MDN örneklerine uymuyor

yukarıdaki bağlantıdaki 'Açıklama' bölümüne bakın

Benim için çalışan aşağıdakilerle giderdim:

let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)

// that makes dynamicRegExp = /findMe/gi

1
Hala çalışıyor. Sorun 'ReGeX' + testVar + 'ReGeX'in çözümü kafa karıştırıcı hale getirmesidir. Aslında bir örnek eklemek, bence bazı şeyleri temizleyecektir. var testVar = '321'; var regex = yeni RegExp ("[" + testVar + "] {2}", "g"); // yukarıda / [321] {2} / g'ye eşdeğer
HelloWorldPeace

1

Yalnızca önce string değişkenini hazırlamak ve daha sonra RegEx'e dönüştürmek gerekir.

Örneğin:

Eklemek istediğiniz minLengthve MaxLengthRegEx'in için değişken ile:

function getRegEx() {
    const minLength = "5"; // for exapmle: min is 5
    const maxLength = "12"; // for exapmle: man is 12

    var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
    regEx = new RegExp(regEx, "g"); // now we convert it to RegEx

    return regEx; // In the end, we return the RegEx
}

şimdi MaxLengthveya değerini MinLengthdeğiştirirseniz, tüm RegEx'lerde değişecektir.

Yararlı olmayı umuyoruz. İngilizcem için de üzgünüm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.