Gunakan string dinamis (variabel) sebagai pola regex di JavaScript

108

Saya ingin menambahkan tag (variabel) ke nilai dengan regex, polanya berfungsi dengan baik dengan PHP tetapi saya mengalami masalah dalam menerapkannya ke JavaScript.

Polanya adalah ( valueadalah variabel):

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

Saya lolos dari garis miring terbalik:

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

Tapi ini sepertinya tidak benar, saya mencatat polanya dan persis seperti apa seharusnya. Ada ide?

Borstenhorst
sumber
Apakah valuevariabel?
Dogbert

Jawaban:

186

Untuk membuat regex dari string, Anda harus menggunakan JavaScript ini RegExpobjek .

Jika Anda juga ingin mencocokkan / mengganti lebih dari satu kali, maka Anda harus menambahkan satu g(pertandingan global) bendera . Berikut contohnya:

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.

Demo JSFiddle di sini.


Dalam kasus umum, escape string sebelum menggunakan sebagai regex:

Namun, tidak setiap string adalah regex yang valid: ada beberapa karakter khusus, seperti (atau [. Untuk mengatasi masalah ini, cukup lepaskan string sebelum mengubahnya menjadi regex. Fungsi utilitas untuk itu ada dalam contoh di bawah ini:

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.

Demo JSFiddle di sini.



Catatan: ekspresi reguler dalam pertanyaan menggunakan spengubah, yang tidak ada pada saat pertanyaan dibuat, tetapi ada - bendera / pengubah s( dotall ) di JavaScript - hari ini .

acdcjunior.dll
sumber
2
ini bagus dan contoh terbaik yang saya temukan sejauh ini tentang penggunaan variabel dinamis dalam regex, terima kasih!
Eolis
1
Untuk 2019 ada s modifier, lihat lagi link MDN di note jawaban.
Nickensoul
@Nickensoul Terlihat bagus! Terimakasih atas peringatannya!
acdcjunior
let idr = new RegExp (variabel + "$"); Table.find ({field: new RegExp (idr, 'i')}) Saya suka ini. Bersulang.
Utkarsh
14

Jika Anda mencoba menggunakan nilai variabel dalam ekspresi, Anda harus menggunakan "konstruktor" RegExp.

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

Anda tidak perlu "untuk menentukan ekspresi reguler jadi cukup:

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

Jika valueadalah variabel dan Anda menginginkan ekspresi reguler dinamis, Anda tidak dapat menggunakan notasi ini; gunakan notasi alternatif.

String.replace juga menerima string sebagai masukan, jadi Anda bisa melakukannya "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");

Ingatlah bahwa jika valueberisi karakter ekspresi reguler seperti (, [dan ?Anda harus melepaskannya.

Tenang
sumber
2
Opsi pertama tidak akan berfungsi kecuali mencari string "nilai"
mothmonsterman
@happytimeharry Tampaknya ada konflik antara dua regexps yang dia posting.
Halcyon
@Fritz van Campen tampaknya maksud dari pola, yang diberikan contoh dari javascript-nya, adalah menggunakan variabel
mothmonsterman
masalah yang sama di sini, tampaknya ada yang salah dengan "is" flag: "SyntaxError Tidak Tertangkap: Flag tidak valid diberikan ke konstruktor RegExp 'is'"
Borstenhorst
bendera untuk konstruktor RegExp perlu dipisahkan. Tapi tetap saja regex tidak berfungsi.
Borstenhorst
5

Saya menemukan utas ini berguna - jadi saya pikir saya akan menambahkan jawaban untuk masalah saya sendiri.

Saya ingin mengedit file konfigurasi database (datastax cassandra) dari aplikasi node di javascript dan untuk salah satu pengaturan di file saya harus mencocokkan pada string dan kemudian mengganti baris yang mengikutinya.

Ini adalah solusi saya.

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

Setelah berjalan, ini akan mengubah pengaturan direktori data yang ada ke yang baru:

file konfigurasi sebelumnya:

data_file_directories:  
   - /var/lib/cassandra/data

file konfigurasi setelah:

data_file_directories:  
- /mnt/cassandra/data
JRD
sumber
4

Saya merasa saya harus menggandakan \ b agar berfungsi. Misalnya untuk menghapus kata "1x" dari string menggunakan variabel, saya perlu menggunakan:

    str = "1x";
    var regex = new RegExp("\\b"+str+"\\b","g"); // same as inv.replace(/\b1x\b/g, "")
    inv=inv.replace(regex, "");
akan
sumber
Bekerja untuk saya. Terima kasih,
Pravin Bhapkar
1

Cara yang jauh lebih mudah: gunakan literal template.

var variable = 'foo'
var expression = `.*${variable}.*`
var re = new RegExp(expression, 'g')
re.test('fdjklsffoodjkslfd') // true
re.test('fdjklsfdjkslfd') // false
Alec Donald Mather
sumber
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/

Semoga ini membantu

Vinu
sumber