it-swarm.dev

استخدم السلسلة الديناميكية (متغير) كنمط regex في JavaScript

أريد إضافة علامة (متغير) إلى القيم مع regex ، النمط يعمل بشكل جيد مع PHP لكن لدي مشاكل في تطبيقه في JavaScript.

النموذج هو (value هو المتغير):

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

هربت من خطوط مائلة للخلف:

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

لكن يبدو أن هذا ليس صحيحًا ، لقد سجلت النمط و بالضبط ما يجب أن يكون. أيه أفكار؟

55
Borstenhorst

لإنشاء regex من سلسلة ، يجب عليك استخدام JavaScript كائن RegExp .

أريد أيضًا المطابقة/الاستبدال أكثر من مرة واحدة ، ثم لا تنسَ إضافة علامة 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 التجريبي هنا.


في الحالة العامة ، هرب من السلسلة قبل استخدام كـ regex:

ليس كل سلسلة عبارة عن regex صالح ، على الرغم من: هناك بعض الأحرف المميزة ، مثل ( أو [. لحل هذه المشكلة ، ببساطة الهروب من السلسلة قبل تحويله إلى regex. وظيفة الأداة المساعدة لذلك في العينة أدناه:

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 التجريبي هنا.



ملاحظة: يستخدم regex في السؤال معدل s ، والذي غير موجود - لا يوجد s (dotall) إشارة/معدل في JavaScript .

107
acdcjunior

إذا كنت تحاول استخدام قيمة متغيرة في التعبير ، فيجب عليك استخدام "مُنشئ" RegExp.

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

لقد وجدت هذا الخيط مفيدًا - لذا اعتقدت أنني سأضيف الإجابة لمشكلتي.

كنت أرغب في تحرير ملف تكوين قاعدة بيانات (datastax cassandra) من تطبيق عقدة في javascript ولإحدى الإعدادات الموجودة في الملف كنت بحاجة للمطابقة على سلسلة ثم استبدال السطر الذي يليه.

كان هذا هو الحل الخاص بي.

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

بعد التشغيل ، سيغير إعداد دليل البيانات الموجود إلى الإعداد الجديد:

ملف التكوين قبل:

data_file_directories:  
   - /var/lib/cassandra/data

ملف التكوين بعد:

data_file_directories:  
- /mnt/cassandra/data
4
JRD

لا تحتاج إلى " لتعريف تعبير عادي حتى:

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

إذا كان value متغيرًا وتريد تعبيرًا ديناميكيًا عاديًا فلا يمكنك استخدام هذا الترميز ؛ استخدم الترميز البديل.

يقبل String.replace أيضًا السلاسل كمدخلات ، بحيث يمكنك القيام "fox".replace("fox", "bear");

لبديل:

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

ضع في اعتبارك أنه إذا كان value يحتوي على أحرف تعبير عادية مثل ( و [ و ? فسوف تحتاج إلى الهروب منها.

2
Halcyon
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/

أتمنى أن يساعدك هذا

0
Vinu