जावास्क्रिप्ट बदलें / regex


113

इस समारोह को देखते हुए:

function Repeater(template) {

    var repeater = {

        markup: template,

        replace: function(pattern, value) {
            this.markup = this.markup.replace(pattern, value);
        }

    };

    return repeater;

};

मैं this.markup.replace()विश्व स्तर पर कैसे जगह बनाऊं? यहाँ समस्या है। अगर मैं इसे इस तरह से उपयोग करता हूं:

alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup);

अलर्ट का मान "फोब्बर $ TEST_ONE" है।

यदि मैं Repeaterनिम्नलिखित में परिवर्तन करता हूं , तो क्रोम में प्रतिस्थापित कुछ भी नहीं:

function Repeater(template) {

    var repeater = {

        markup: template,

        replace: function(pattern, value) {
            this.markup = this.markup.replace(new RegExp(pattern, "gm"), value);
        }

    };

    return repeater;

};

... और अलर्ट है $TEST_ONE $TEST_ONE

जवाबों:


147

आपको किसी भी RegExp वर्ण (एक बार स्ट्रिंग में स्लैश के लिए और एक बार regexp के लिए) से बचने की आवश्यकता है:

  "$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")

अन्यथा, यह लाइन के अंत और 'टेस्टोन' के लिए दिखता है (जो इसे कभी नहीं मिलता है)।

व्यक्तिगत रूप से, मैं इस कारण से रेगीक्सपी के स्ट्रिंग्स के निर्माण का बहुत बड़ा प्रशंसक नहीं हूं। भागने के स्तर की जरूरत है कि आप पीने के लिए नेतृत्व कर सकते हैं। मुझे यकीन है कि अन्य लोग अलग तरह से महसूस करते हैं और जब शराब पीना पसंद करते हैं तो रेक्स लिखते हैं।


लेकिन बदलें () एक चर के रूप में रेगेक्स प्राप्त करता है।
कोर

8
@ क्रिस - मुझे नहीं लगता कि इसका कोई फर्क पड़ता है अगर आप इसका इस्तेमाल करते हैं /pattern/या new RegExp("pattern")
harto

@ सेठ, आपका उत्तर काम करता है, लेकिन यह ओपी के कोड का समाधान प्रदान नहीं करता है। मुझे ओपी कोड को कैसे कॉल करना है?
काला

82

पैटर्न व्याख्या के संदर्भ में, निम्नलिखित रूपों में कोई अंतर नहीं है:

  • /pattern/
  • new RegExp("pattern")

यदि आप replaceविधि का उपयोग करके शाब्दिक स्ट्रिंग को बदलना चाहते हैं , तो मुझे लगता है कि आप एक स्ट्रिंग को एक रेगेक्सपी के बजाय पास कर सकते हैं replace

अन्यथा, आपको पहले पैटर्न में किसी भी regexp विशेष वर्ण से बचना होगा - शायद ऐसा:

function reEscape(s) {
    return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
}

// ...

var re = new RegExp(reEscape(pattern), "mg");
this.markup = this.markup.replace(re, value);

12
पहले नहीं पता था, कि / पैटर्न / नए RegExp ("पैटर्न") के समान है। वास्तव में मदद की!
निक सुमीको

1
ब्लैक लिस्ट के बजाय श्वेतसूची का उपयोग न करने का कोई कारण? उदाहरण: s.replace (/ (\ W) / g, '\\ $ 1')
greg.kindel

1
सूचीबद्ध पहला रूप बेहतर है। नए कीवर्ड से बचने के लिए यह अच्छा अभ्यास है ।
Druska

2
यह कहना सही नहीं है कि रेगुलर एक्सप्रेशन शाब्दिक (/ regex /) RegExp ("regex") के समान है। नियमित अभिव्यक्ति शाब्दिक रूप में, रिवर्स-सॉलिडस ('\') को नियमित अभिव्यक्ति का हिस्सा बनने के लिए खुद को बचाना नहीं चाहिए ('\\')। इसके अलावा, नियमित अभिव्यक्ति शाब्दिक रूप से संकलित की जा सकती है, जब स्क्रिप्ट को निष्पादित होने के बजाय स्क्रिप्ट को पार्स किया जाता है। रिवर्स-सॉलिडस का मिलान करने के लिए आप या तो / \\ / या RexExp ("\\\\") लिख सकते हैं।
जॉन

31

आपके रेगेक्स पैटर्न में जी संशोधक होना चाहिए:

var pattern = /[somepattern]+/g;

अंत में जी को नोटिस करें। यह प्रतिकृति को एक वैश्विक प्रतिस्थापन करने के लिए कहता है।

इसके अलावा, आप RegExp वस्तु का उपयोग करने की आवश्यकता नहीं है आप ऊपर के रूप में अपने पैटर्न का निर्माण कर सकते हैं। उदाहरण पैटर्न:

var pattern = /[0-9a-zA-Z]+/g;

एक पैटर्न हमेशा / दोनों तरफ से घिरा होता है - अंतिम / के बाद संशोधक के साथ, जी संशोधक वैश्विक हो रहा है।

संपादित करें: यदि पैटर्न एक चर है तो यह क्यों मायने रखता है? आपके मामले में यह इस तरह काम करेगा (ध्यान दें कि पैटर्न अभी भी एक चर है):

var pattern = /[0-9a-zA-Z]+/g;
repeater.replace(pattern, "1234abc");

लेकिन आपको अपना बदला हुआ कार्य इसमें बदलना होगा:

this.markup = this.markup.replace(pattern, value);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.