javascript - test - regular expression شرح




كيف تستخدم متغيرًا في تعبير عادي؟ (11)

"ABABAB".replace(/B/g, "A");

كما هو الحال دائمًا: لا تستخدم التعبير العادي ما لم تضطر إلى ذلك. لاستبدال السلاسل البسيطة ، يكون المصطلح:

'ABABAB'.split('B').join('A')

ثم لا داعي للقلق بشأن الاقتباس من القضايا المذكورة في إجابة Gracenotes.

أرغب في إنشاء طريقة String.replaceAll () في جافا سكريبت وأنا أفكر في أن استخدام RegEx سيكون أكثر طريقة ممكنة للقيام بذلك. ومع ذلك ، لا يمكنني معرفة كيفية تمرير متغير في RegEx. يمكنني القيام بذلك بالفعل والتي ستحل محل جميع مثيلات "B" مع "A".

"ABABAB".replace(/B/g, "A");

لكنني أريد أن أفعل شيئًا كهذا:

String.prototype.replaceAll = function(replaceThis, withThis) {
    this.replace(/replaceThis/g, withThis);
};

ولكن من الواضح أن هذا لن يؤدي إلا إلى استبدال النص "replaceThis" ... لذا كيف يمكنني تمرير هذا المتغير إلى سلسلتي RegEx؟


إليك تطبيق replaceAll آخر:

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if ( stringToFind == stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

تريد إنشاء التعبير العادي بشكل حيوي ولهذا الحل الصحيح هو استخدام مُنشئ new RegExp(string) . لكي يعالج المنشئ الأحرف الخاصة حرفيًا ، يجب عليك الهروب منها. هناك وظيفة $.ui.autocomplete.escapeRegex عنصر واجهة المستخدم autocomplete jQuery UI المسمى $.ui.autocomplete.escapeRegex :

[...] يمكنك استخدام وظيفة $.ui.autocomplete.escapeRegex . سيستغرق الأمر وسيطة سلسلة واحدة ويخرج من جميع أحرف regex ، مما يجعل النتيجة آمنة لتمريرها إلى new RegExp() .

إذا كنت تستخدم jQuery UI ، فيمكنك استخدام هذه الوظيفة ، أو نسخ تعريفها من المصدر :

function escapeRegex(value) {
    return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}

واستخدمها على هذا النحو:

"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
//            escapeRegex("[z-a]")       -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result                            -> "[a-z][a-z][a-z]"

على الرغم من أنه يمكنك إنشاء RegExp بشكل ديناميكي (وفقًا للإجابات الأخرى على هذا السؤال) ، فسوف أردد تعليقي من مشاركة مشابهة : النموذج الوظيفي لـ String.replace() مفيد للغاية وفي كثير من الحالات يقلل من الحاجة إلى كائنات RegExp التي تم إنشاؤها ديناميكيًا. (والتي هي نوع من الألم) لأنك يجب أن تعبر عن المدخلات إلى منشئ RegExp كسلسلة بدلاً من استخدام الشريحتين / [AZ] + / صيغة حرفية regexp)


كما ذكر Eric Wendelin ، يمكنك فعل شيء كالتالي:

str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");

ينتج عن هذا "regex matching ." . ومع ذلك ، ستفشل إذا كان str1 هو "." . كنت تتوقع أن تكون النتيجة "pattern matching regex" ، استبدال الفترة مع "regex" ، ولكن سوف يتحول إلى أن يكون ...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

هذا لأنه ، على الرغم من "." هي سلسلة ، في مُنشئ RegExp ، لا يزال يتم تفسيرها على أنها تعبير عادي ، أي أي حرف غير خطي ، أي كل حرف في السلسلة. لهذا الغرض ، قد تكون الوظيفة التالية مفيدة:

 RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
 };

ثم يمكنك القيام بما يلي:

str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");

تقديم "pattern matching regex" .


لأي شخص يتطلع إلى استخدام متغير مع طريقة المباراة ، هذا العمل بالنسبة لي

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight


ونسخة coffeescript من إجابة ستيفن بيني ، لأن هذا هو نتيجة جوجل # 2 .... حتى إذا كان القهوة مجرد جافا سكريبت مع الكثير من الشخصيات إزالتها ... ؛)

baz = "foo"
filter = new RegExp(baz + "d")
"food fight".match(filter)[0] // food

وفي حالتي الخاصة

robot.name=hubot
filter = new RegExp(robot.name)
if msg.match.input.match(filter)
  console.log "True!"

يمكنك دائمًا استخدام indexOf بشكل متكرر:

String.prototype.replaceAll = function(substring, replacement) {
    var result = '';
    var lastIndex = 0;

    while(true) {
        var index = this.indexOf(substring, lastIndex);
        if(index === -1) break;
        result += this.substring(lastIndex, index) + replacement;
        lastIndex = index + substring.length;
    }

    return result + this.substring(lastIndex);
};

هذا لا يذهب إلى حلقة لا نهائية عندما يحتوي الاستبدال على المباراة.


String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

اختبار مع هذه tool


this.replace( new RegExp( replaceThis, 'g' ), withThis );






regex