JavaScript'te normal ifade kalıbı olarak dinamik (değişken) dizeyi kullanın


109

Normal ifadeyle değerlere bir (değişken) etiketi eklemek istiyorum , desen PHP ile iyi çalışıyor, ancak onu JavaScript'e uygulama konusunda sorunlar yaşıyorum.

Kalıp ( valuedeğişkendir):

/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is

Ters eğik çizgilerden kaçtım:

var str = $("#div").html();
var regex = "/(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b/is";
$("#div").html(str.replace(regex, "<a href='#" + value +">" + value + "</a>"));

Ama bu doğru görünmüyor, ben modeli ve tam olarak ne olması gerektiğini kaydettim. Herhangi bir fikir?


valuedeğişken?
Dogbert

Yanıtlar:


188

Normal ifadeyi bir dizeden oluşturmak için JavaScript'in RegExpnesnesini kullanmanız gerekir .

Aynı zamanda birden fazla kez eşleştirmek / değiştirmek istiyorsanız , (global eşleşme) bayrağını eklemeniz gerekir . İşte bir örnek:g

var stringToGoIntoTheRegex = "abc";
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;

var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.

JSFiddle demosu burada.


Genel durumda, normal ifade olarak kullanmadan önce dizeden çıkın:

Ancak her dize geçerli bir normal ifade değildir: (veya gibi bazı özel karakterler vardır [. Bu sorunu çözmek için, bir normal ifadeye dönüştürmeden önce dizeden çıkmanız yeterlidir. Bunun için bir yardımcı program işlevi aşağıdaki örnekte yer almaktadır:

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

var stringToGoIntoTheRegex = escapeRegExp("abc"); // this is the only change from above
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;

var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.

JSFiddle demosu burada.



Not: Söz konusu regex kullanan ssorunun anda var olmayan değiştirici, ama var mıdır - bir s( dotall ) bayrak / değiştirici JavaScript - bugün .


2
bu harika ve şimdiye kadar bir regex'te dinamik bir değişken kullanma konusunda bulduğum en iyi örnek, teşekkürler!
Eolis

1
2019 için s değiştirici var, yanıtın notundaki MDN bağlantısına tekrar bakın.
Nickensoul

@Nickensoul İyi görüldü! Söylediğin için teşekkürler!
acdcjunior

let idr = new RegExp (değişken + "$"); Table.find ({field: new RegExp (idr, 'i')}) Bunu beğendim. Şerefe.
Utkarsh

14

İfadede bir değişken değeri kullanmaya çalışıyorsanız, RegExp "yapıcısını" kullanmanız gerekir.

var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b";
new RegExp(regex, "is")

7

"Normal bir ifade tanımlamanıza gerek yoktur, bu nedenle sadece:

var regex = /(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is; // this is valid syntax

Eğer valuebir değişkendir ve daha sonra dinamik bir normal ifadeyi istiyorum bu notasyonu kullanamazsınız; alternatif gösterimi kullanın.

String.replace dizeleri de girdi olarak kabul eder, böylece "fox".replace("fox", "bear");

Alternatif:

var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(.*?)\b/", "is");

Eğer unutmayın valuegibi düzenli ifadeler karakterler içeriyor (, [ve ?bunları kaçmak gerekir.


2
İlk seçenek, "değer" dizesini
aramadıkça çalışmaz

@happytimeharry Gönderdiği iki normal ifade arasında bir çelişki var gibi görünüyor.
Halcyon

@Fritz van Campen, javascript örneğinden verilen
kalıbın amacının

aynı sorun burada, "is"
işaretiyle

RegExp kurucusu için bayrakların ayrılması gerekir. Ancak yine de normal ifade çalışmıyor.
Borstenhorst

5

Bu konuyu faydalı buldum - bu yüzden cevabı kendi problemime ekleyeceğimi düşündüm.

JavaScript'teki bir düğüm uygulamasından bir veritabanı yapılandırma dosyasını (datastax cassandra) düzenlemek ve dosyadaki ayarlardan biri için bir dizeyle eşleşmek ve ardından onu izleyen satırı değiştirmek istedim.

Bu benim çözümümdü.

dse_cassandra_yaml='/etc/dse/cassandra/cassandra.yaml'

// a) find the searchString and grab all text on the following line to it
// b) replace all next line text with a newString supplied to function
// note - leaves searchString text untouched
function replaceStringNextLine(file, searchString, newString) {
fs.readFile(file, 'utf-8', function(err, data){
if (err) throw err;
    // need to use double escape '\\' when putting regex in strings !
    var re = "\\s+(\\-\\s(.*)?)(?:\\s|$)";
    var myRegExp = new RegExp(searchString + re, "g");
    var match = myRegExp.exec(data);
    var replaceThis = match[1];
    var writeString = data.replace(replaceThis, newString);
    fs.writeFile(file, writeString, 'utf-8', function (err) {
    if (err) throw err;
        console.log(file + ' updated');
    });
});
}

searchString = "data_file_directories:"
newString = "- /mnt/cassandra/data"

replaceStringNextLine(dse_cassandra_yaml, searchString, newString );

Çalıştırdıktan sonra, mevcut veri dizini ayarını yenisiyle değiştirecektir:

config dosyası önce:

data_file_directories:  
   - /var/lib/cassandra/data

sonra yapılandırma dosyası:

data_file_directories:  
- /mnt/cassandra/data

4

Çalışması için \ b'yi iki kez kesmem gerektiğini buldum. Örneğin, değişken kullanan bir dizeden "1x" kelimeyi kaldırmak için şunu kullanmam gerekiyordu:

    str = "1x";
    var regex = new RegExp("\\b"+str+"\\b","g"); // same as inv.replace(/\b1x\b/g, "")
    inv=inv.replace(regex, "");

Benim için çalıştı. Teşekkürler,
Pravin Bhapkar

1

Çok daha kolay yol: şablon değişmezlerini kullanın.

var variable = 'foo'
var expression = `.*${variable}.*`
var re = new RegExp(expression, 'g')
re.test('fdjklsffoodjkslfd') // true
re.test('fdjklsfdjkslfd') // false

0
var string = "Hi welcome to stack overflow"
var toSearch = "stack"

//case insensitive search

var result = string.search(new RegExp(toSearch, "i")) > 0 ? 'Matched' : 'notMatched'

https://jsfiddle.net/9f0mb6Lz/

Bu yardımcı olur umarı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.