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 ( value
adalah 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?
javascript
regex
string
Borstenhorst
sumber
sumber
value
variabel?Jawaban:
Untuk membuat regex dari string, Anda harus menggunakan JavaScript ini
RegExp
objek .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
s
pengubah, yang tidak ada pada saat pertanyaan dibuat, tetapi ada - bendera / pengubahs
( dotall ) di JavaScript - hari ini .sumber
s
modifier, lihat lagi link MDN di note jawaban.Jika Anda mencoba menggunakan nilai variabel dalam ekspresi, Anda harus menggunakan "konstruktor" RegExp.
var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b"; new RegExp(regex, "is")
sumber
Anda tidak perlu
"
untuk menentukan ekspresi reguler jadi cukup:var regex = /(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is; // this is valid syntax
Jika
value
adalah 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
value
berisi karakter ekspresi reguler seperti(
,[
dan?
Anda harus melepaskannya.sumber
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
sumber
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, "");
sumber
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
sumber
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
sumber