জাভাস্ক্রিপ্ট প্রতিস্থাপন / 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

আপনার যেকোনও রেজিপ্স অক্ষর দ্বিগুণভাবে পালাতে হবে (একবার স্ট্রিংয়ের স্ল্যাশের জন্য এবং একবার রেজিপ্স্পের জন্য):

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

অন্যথায়, এটি লাইনটির শেষ এবং 'টেস্টোন' (যা এটি কখনই খুঁজে পায় না) সন্ধান করে।

ব্যক্তিগতভাবে, আমি এই কারণে স্ট্রিংগুলি ব্যবহার করে রেজিএক্সপ্যাক্সের বিল্ডিংয়ের খুব বেশি ভক্ত নই। যে পরিমাণ পালানোর দরকার তা আপনাকে পান করার দিকে নিয়ে যেতে পারে। আমি নিশ্চিত যে রেজিজেসগুলি লেখার সময় অন্যরা আলাদাভাবে অনুভব করে এবং মদ্যপান করতে পছন্দ করে।


কিন্তু প্রতিস্থাপন () ভেরিয়েবল হিসাবে রেজেক্স গ্রহণ করে।
কোর

8
@ ক্রিস - আমি মনে করি না আপনি যদি ব্যবহার করেন /pattern/বা ব্যবহার করেন তবে এটি কোনও পার্থক্য করে new RegExp("pattern")
হার্টো

@ সেথ, আপনার উত্তরটি কাজ করে তবে এটি ওপি থেকে কোডটির কোনও সমাধান সরবরাহ করে না। ওপির কোডটি কীভাবে কল করতে হবে?
কালো

82

প্যাটার্ন ব্যাখ্যার ক্ষেত্রে, নিম্নলিখিত ফর্মগুলির মধ্যে কোনও পার্থক্য নেই:

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

আপনি যদি replaceপদ্ধতিটি ব্যবহার করে আক্ষরিক স্ট্রিংটি প্রতিস্থাপন করতে চান তবে আমি মনে করি আপনি কেবল একটি রেজিগক্সের পরিবর্তে একটি স্ট্রিং পাস করতে পারেন replace

অন্যথায়, আপনাকে প্রথমে প্যাটার্নে কোনও রেজিপ এক্স বিশেষ অক্ষর এড়াতে হবে - সম্ভবত এটির মতো:

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

// ...

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

12
আগে জানতাম না, সেই / প্যাটার্নটি / নতুন রেজিপ্স্প ("প্যাটার্ন") এর সমান। সত্যিই সাহায্য!
নিক সুমিকো

1
ব্ল্যাকলিস্টের পরিবর্তে কোনও শ্বেতলিস্ট ব্যবহার না করার কোনও কারণ? উদাহরণস্বরূপ: s.replace (/ (\ ডাব্লু) / জি, '\\ $ 1'))
গ্রেগ.গ্র্যান্ডেল

1
তালিকাভুক্ত প্রথম ফর্মটি আরও ভাল। নতুন কীওয়ার্ডটি এড়ানো ভাল অনুশীলন ।
দ্রুসকা

2
এটি বলা সঠিক নয় যে নিয়মিত এক্সপ্রেশন আক্ষরিক (/ regex /) RegExp ("regex") এর মতই। আক্ষরিক নিয়মিত অভিব্যক্তিতে, বিপরীতমুখী ('\') এটিকে নিয়মিত অভিব্যক্তির অংশ হওয়ার জন্য নিজেকে ('\\') এড়িয়ে যাওয়ার প্রয়োজন হয় না। আরও, নিয়মিত এক্সপ্রেশন আক্ষরিক সংকলন করা যেতে পারে যখন স্ক্রিপ্টটি পার্স করা না হয়ে প্রতিবার ফাংশনটি সম্পাদন করা হয়। বিপরীত-কঠিনের সাথে মিল রাখতে আপনি / / \\ / অথবা রেক্সএক্সপ্যাক ("\\\\") লিখতে পারেন।
জন

31

আপনার রেজেক্স প্যাটার্নটিতে জি সংশোধক হওয়া উচিত:

var pattern = /[somepattern]+/g;

শেষে জি লক্ষ্য করুন। এটি replacer কে বিশ্বব্যাপী প্রতিস্থাপন করতে বলে।

উপরের মতো আপনার প্যাটার্নটিও আপনি তৈরি করতে পারেন RegExp অবজেক্টটি ব্যবহার করার দরকার নেই। উদাহরণ প্যাটার্ন:

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

একটি প্যাটার্ন সর্বদা উভয় পক্ষের সাথে ঘিরে থাকে - চূড়ান্ত / পরে জি সংশোধকটি বৈশ্বিক হয়ে থাকে being

সম্পাদনা: প্যাটার্নটি যদি ভেরিয়েবল হয় তবে তা কেন গুরুত্বপূর্ণ? আপনার ক্ষেত্রে এটি এর মতো কাজ করবে (লক্ষ্য করুন যে প্যাটার্নটি এখনও একটি পরিবর্তনশীল):

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

তবে আপনার নিজের প্রতিস্থাপনের কাজটি এতে পরিবর্তন করতে হবে:

this.markup = this.markup.replace(pattern, value);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.