কীভাবে জাভাস্ক্রিপ্টে দীর্ঘ নিয়মিত প্রকাশকে একাধিক লাইনে বিভক্ত করবেন?


138

আমার খুব দীর্ঘ নিয়মিত অভিব্যক্তি রয়েছে, যা জেএসএলিন্ট নিয়ম অনুসারে প্রতিটি লাইনের দৈর্ঘ্য 80 টি অক্ষর রাখার জন্য আমি আমার জাভাস্ক্রিপ্ট কোডে একাধিক লাইনে বিভক্ত করতে চাই। এটি পড়ার জন্য কেবল ভাল I এখানে নিদর্শন নমুনা:

var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

4
দেখে মনে হচ্ছে আপনি (ইমেল ঠিকানাগুলি যাচাই করার চেষ্টা করছেন)। কেন সহজভাবে না /\S+@\S+\.\S+/?
বার্ট কায়ার্স

1
আপনার নিয়মিত প্রকাশ ছাড়াই বা একাধিক ছোট নিয়মিত এক্সপ্রেশন ছাড়াই এটি করার উপায় খুঁজে পাওয়া উচিত। এটি দীর্ঘ হিসাবে নিয়মিত প্রকাশের চেয়ে অনেক বেশি পঠনযোগ্য। যদি আপনার নিয়মিত অভিব্যক্তি প্রায় 20 টিরও বেশি অক্ষরের হয় তবে এটি করার আরও ভাল উপায় সম্ভবত।
ফোর্বস লিন্ডসে

2
বিস্তৃত মনিটরের সাথে আজকাল ৮০ টি চরিত্র কি অপ্রচলিত নয়?
ওলেগ ভি। ভোলকভ

7
@ ওলেগভি.ভলকভ নং। কোনও ব্যক্তি একটি সার্ভার রুমের ভার্চুয়াল টার্মিনাল ভিআইএম-এ বিভক্ত উইন্ডো ব্যবহার করতে পারে। আপনার মতো একই ভিউপোর্টে সবাই কোডিং করবে ধরে নেওয়া ভুল is তদ্ব্যতীত, আপনার লাইনগুলি 80 টি অক্ষরে সীমাবদ্ধ করা আপনাকে আপনার কোডটিকে ছোট ফাংশনে বিভক্ত করতে বাধ্য করে।
synic

ঠিক আছে, আমি অবশ্যই এখানে এটি করার জন্য আপনার অনুপ্রেরণাটি দেখতে পাচ্ছি - একবার এই রেজেক্সটি একাধিক লাইনের উপর বিভক্ত হয়ে গেছে, যেমন কুলিলঙ্ক দেখিয়েছে, এটি অবিলম্বে পাঠযোগ্য, স্ব-ডকুমেন্টিং কোডের একটি নিখুঁত উদাহরণ হয়ে ওঠে। ¬_¬
মার্ক এ Amery

উত্তর:


115

আপনি এটিকে একটি স্ট্রিতে রূপান্তর করতে এবং কল করে অভিব্যক্তিটি তৈরি করতে পারেন new RegExp():

var myRE = new RegExp (['^(([^<>()[\]\\.,;:\\s@\"]+(\\.[^<>(),[\]\\.,;:\\s@\"]+)*)',
                        '|(\\".+\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.',
                        '[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\\.)+',
                        '[a-zA-Z]{2,}))$'].join(''));

মন্তব্য:

  1. স্ট্রিংকে আক্ষরিক মূল্যায়ন করার সময় ব্যাকস্ল্যাশগুলি গ্রাস করা হওয়ায় আপনার সমস্ত ব্যাকস্ল্যাশগুলি এড়ানোর দরকার হয় যখন স্ট্রিনে আক্ষরিক ভাবটি রূপান্তরিত করতে হবে । (আরও বিস্তারিত জানার জন্য কায়োর মন্তব্য দেখুন))
  2. RegExp সংশোধকগুলিকে দ্বিতীয় প্যারামিটার হিসাবে গ্রহণ করে

    /regex/g => new RegExp('regex', 'g')

[ সংযোজন ES20xx (ট্যাগ টেম্পলেট)]

ES20xx এ আপনি ট্যাগযুক্ত টেম্পলেট ব্যবহার করতে পারেন । স্নিপেট দেখুন।

বিঃদ্রঃ:

  • এখানে অসুবিধা হল যে আপনি রেগুলার এক্সপ্রেশন স্ট্রিং প্লেইন হোয়াইটস্পেস ব্যবহার করতে পারবেন না (সবসময় ব্যবহার করেন \s, \s+, \s{1,x}, \t, \nইত্যাদি)।

(() => {
  const createRegExp = (str, opts) => 
    new RegExp(str.raw[0].replace(/\s/gm, ""), opts || "");
  const yourRE = createRegExp`
    ^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|
    (\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|
    (([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$`;
  console.log(yourRE);
  const anotherLongRE = createRegExp`
    (\byyyy\b)|(\bm\b)|(\bd\b)|(\bh\b)|(\bmi\b)|(\bs\b)|(\bms\b)|
    (\bwd\b)|(\bmm\b)|(\bdd\b)|(\bhh\b)|(\bMI\b)|(\bS\b)|(\bMS\b)|
    (\bM\b)|(\bMM\b)|(\bdow\b)|(\bDOW\b)
    ${"gi"}`;
  console.log(anotherLongRE);
})();


4
একজন new RegExpএকাধিক লাইন রেগুলার এক্সপ্রেশনের জন্য একটি দুর্দান্ত উপায়। অ্যারেগুলিতে যোগদানের পরিবর্তে, আপনি কেবল একটি স্ট্রিং var reg = new RegExp('^([a-' + 'z]+)$','i');
কনটেনটেশন

43
সতর্কতা: একটি দীর্ঘ নিয়মিত অভিব্যক্তি আক্ষরিক উপরের উত্তরটি ব্যবহার করে একাধিক লাইনে বিভক্ত হতে পারে। তবে এটির যত্নের প্রয়োজন কারণ আপনি কেবল নিয়মিত এক্সপ্রেশন আক্ষরিক (এর সাথে সংজ্ঞায়িত //) অনুলিপি করতে পারবেন না এবং এটিকে স্ট্রিং আর্গুমেন্ট হিসাবে রেজিপ্স কনস্ট্রাক্টরের কাছে পেস্ট করতে পারবেন না । কারণ স্ট্রিং আক্ষরিক মূল্যায়ন করার সময় ব্যাকস্ল্যাশ অক্ষরগুলি গ্রাস হয়ে যায় । উদাহরণ: /Hey\sthere/দ্বারা প্রতিস্থাপন করা যাবে না new RegExp("Hey\sthere")। পরিবর্তে এটি new RegExp("Hey\\sthere")অতিরিক্ত ব্যাকস্ল্যাশ নোট দ্বারা প্রতিস্থাপন করা উচিত ! অতএব আমি কেবল একটি দীর্ঘ রেখায় একটি দীর্ঘ রেইজেক্স আক্ষরিক ছেড়ে যেতে পছন্দ করি
কায়ো

5
এটি করার একটি আরও সুস্পষ্ট উপায় হ'ল নামযুক্ত ভেরিয়েবলগুলি অর্থপূর্ণ সাবসেকশনগুলি ধারণ করে তৈরি করা এবং সেগুলি স্ট্রিং হিসাবে বা অ্যারেতে যুক্ত হওয়া। এটি আপনাকে RegExpএমনভাবে তৈরি করতে দেয় যা বুঝতে খুব সহজ।
ক্রিস ক্র্যাচো

117

@ কুইইঙ্ক উত্তরটি প্রসারিত করে আপনি বস্তুর sourceসম্পত্তি ব্যবহার করে প্রতিটি বিশেষ চরিত্রটিকে ম্যানুয়ালি পলায়ন এড়াতে পারবেন RegExp

উদাহরণ:

var urlRegex= new RegExp(''
  + /(?:(?:(https?|ftp):)?\/\/)/.source     // protocol
  + /(?:([^:\n\r]+):([^@\n\r]+)@)?/.source  // user:pass
  + /(?:(?:www\.)?([^\/\n\r]+))/.source     // domain
  + /(\/[^?\n\r]+)?/.source                 // request
  + /(\?[^#\n\r]*)?/.source                 // query
  + /(#?[^\n\r]*)?/.source                  // anchor
);

বা আপনি যদি .sourceসম্পত্তিটির পুনরাবৃত্তি এড়াতে চান তবে আপনি এটি Array.map()ফাংশনটি ব্যবহার করে করতে পারেন :

var urlRegex= new RegExp([
  /(?:(?:(https?|ftp):)?\/\/)/      // protocol
  ,/(?:([^:\n\r]+):([^@\n\r]+)@)?/  // user:pass
  ,/(?:(?:www\.)?([^\/\n\r]+))/     // domain
  ,/(\/[^?\n\r]+)?/                 // request
  ,/(\?[^#\n\r]*)?/                 // query
  ,/(#?[^\n\r]*)?/                  // anchor
].map(function(r) {return r.source}).join(''));

ES6 এ মানচিত্রের ফাংশনটি হ্রাস করা যেতে পারে: .map(r => r.source)


3
ঠিক আমি যা খুঁজছিলাম, অতি-পরিষ্কার। ধন্যবাদ!
মারিয়ান জাগোরিউইকো 25'16

10
একটি দীর্ঘ regexp মন্তব্য মন্তব্য করার জন্য এটি সত্যিই সুবিধাজনক। তবে একই লাইনে ম্যাচিং বন্ধনীর দ্বারা এটি সীমাবদ্ধ।
নাথান এস ওয়াটসন-হাই হাই

অবশ্যই, এই! প্রতিটি উপ-রেজেক্স মন্তব্য করার ক্ষমতা সহ দুর্দান্ত দুর্দান্ত।
গ্যারিও

ধন্যবাদ, এটি উত্সকে রেজেক্স ফাংশনে রাখতে সহায়তা করেছিল
কোড

খুব চালাক. ধন্যবাদ, এই ধারণাটি আমাকে অনেক সাহায্য করেছিল। একটি পার্শ্ব নোট হিসাবে: আমি আরও পরিষ্কার করে একটি ফাংশন পুরো জিনিস encapsulated: combineRegex = (...regex) => new RegExp(regex.map(r => r.source).join(""))ব্যবহার:combineRegex(/regex1/, /regex2/, ...)
Scindix

25

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

আসুন এই রেজেক্স বিভক্ত করা যাক

/^foo(.*)\bar$/

জিনিসগুলি পরে আরও সুন্দর করে তুলতে আমরা একটি ফাংশন ব্যবহার করব

function multilineRegExp(regs, options) {
    return new RegExp(regs.map(
        function(reg){ return reg.source; }
    ).join(''), options);
}

এবং এখন রক করা যাক

var r = multilineRegExp([
     /^foo/,  // we can add comments too
     /(.*)/,
     /\bar$/
]);

যেহেতু এটির একটি ব্যয় রয়েছে, ঠিক একবারে আসল রেজেক্স তৈরি করার চেষ্টা করুন এবং তারপরে এটি ব্যবহার করুন।


এটি খুব দুর্দান্ত - কেবল আপনাকে অতিরিক্ত পালানোর দরকার নেই, তবে আপনি সাব-রেজিক্সগুলির জন্য বিশেষ সিনট্যাক্স হাইলাইটটি রাখেন!
কুইজাক

যদিও একটি সাবধানবাণী: আপনাকে নিশ্চিত করতে হবে যে আপনার সাব-রেজিেক্সগুলি স্ব-অন্তর্ভুক্ত রয়েছে বা প্রতিটিকে একটি নতুন বন্ধনী গ্রুপে মোড়ানো। উদাহরণ: multilineRegExp([/a|b/, /c|d])ফলাফলগুলি /a|bc|d/যখন আপনি বোঝাতে চেয়েছিলেন (a|b)(c|d)
কুইজাক

6

এখানে ভাল উত্তর আছে, কিন্তু সম্পূর্ণতার জন্য কারও প্রবোটাইপ চেইনের সাথে জাভাস্ক্রিপ্টের উত্তরাধিকারের মূল বৈশিষ্ট্যটি উল্লেখ করা উচিত । এরকম কিছু ধারণাটি চিত্রিত করে:

RegExp.prototype.append = function(re) {
  return new RegExp(this.source + re.source, this.flags);
};

let regex = /[a-z]/g
.append(/[A-Z]/)
.append(/[0-9]/);

console.log(regex); //=> /[a-z][A-Z][0-9]/g


এটি এখানে সেরা উত্তর।
পার্টটাইমার্থল

6

টেম্পলেট আক্ষরিকের বিস্ময়কর জগতকে ধন্যবাদ আপনি এখন ES6-তে বড়, বহু-লাইন, ভাল-মন্তব্য করেছেন, এমনকি শব্দার্থিকভাবে নেস্টেড রেজেক্সগুলিও লিখতে পারেন।

//build regexes without worrying about
// - double-backslashing
// - adding whitespace for readability
// - adding in comments
let clean = (piece) => (piece
    .replace(/((^|\n)(?:[^\/\\]|\/[^*\/]|\\.)*?)\s*\/\*(?:[^*]|\*[^\/])*(\*\/|)/g, '$1')
    .replace(/((^|\n)(?:[^\/\\]|\/[^\/]|\\.)*?)\s*\/\/[^\n]*/g, '$1')
    .replace(/\n\s*/g, '')
);
window.regex = ({raw}, ...interpolations) => (
    new RegExp(interpolations.reduce(
        (regex, insert, index) => (regex + insert + clean(raw[index + 1])),
        clean(raw[0])
    ))
);

এটি ব্যবহার করে আপনি এখন এটির মতো রেজিڪس লিখতে পারেন:

let re = regex`I'm a special regex{3} //with a comment!`;

আউটপুট

/I'm a special regex{3}/

বা মাল্টলাইন কি?

'123hello'
    .match(regex`
        //so this is a regex

        //here I am matching some numbers
        (\d+)

        //Oh! See how I didn't need to double backslash that \d?
        ([a-z]{1,3}) /*note to self, this is group #2*/
    `)
    [2]

আউটপুটস hel, ঝরঝরে!
"আসলে যদি আমার কোনও নতুন লাইন অনুসন্ধান করার দরকার হয়?", ভাল তবে \nনির্বোধ ব্যবহার করুন !
আমার ফায়ারফক্স এবং ক্রোমে কাজ করা।


ঠিক আছে, "কীভাবে কিছুটা জটিল জটিল?"
অবশ্যই, আমি কাজ করছি এমন জেএস পার্সারকে বিলম্বকারী কোনও অবজেক্টের এখানে :

regex`^\s*
    (
        //closing the object
        (\})|

        //starting from open or comma you can...
        (?:[,{]\s*)(?:
            //have a rest operator
            (\.\.\.)
            |
            //have a property key
            (
                //a non-negative integer
                \b\d+\b
                |
                //any unencapsulated string of the following
                \b[A-Za-z$_][\w$]*\b
                |
                //a quoted string
                //this is #5!
                ("|')(?:
                    //that contains any non-escape, non-quote character
                    (?!\5|\\).
                    |
                    //or any escape sequence
                    (?:\\.)
                //finished by the quote
                )*\5
            )
            //after a property key, we can go inside
            \s*(:|)
      |
      \s*(?={)
        )
    )
    ((?:
        //after closing we expect either
        // - the parent's comma/close,
        // - or the end of the string
        \s*(?:[,}\]=]|$)
        |
        //after the rest operator we expect the close
        \s*\}
        |
        //after diving into a key we expect that object to open
        \s*[{[:]
        |
        //otherwise we saw only a key, we now expect a comma or close
        \s*[,}{]
    ).*)
$`

এটি আউটপুট /^\s*((\})|(?:[,{]\s*)(?:(\.\.\.)|(\b\d+\b|\b[A-Za-z$_][\w$]*\b|("|')(?:(?!\5|\\).|(?:\\.))*\5)\s*(:|)|\s*(?={)))((?:\s*(?:[,}\]=]|$)|\s*\}|\s*[{[:]|\s*[,}{]).*)$/

আর একটু ডেমো দিয়ে চালাচ্ছেন?

let input = '{why, hello, there, "you   huge \\"", 17, {big,smelly}}';
for (
    let parsed;
    parsed = input.match(r);
    input = parsed[parsed.length - 1]
) console.log(parsed[1]);

সাফল্যের সাথে আউটপুটস

{why
, hello
, there
, "you   huge \""
, 17
,
{big
,smelly
}
}

উদ্ধৃত স্ট্রিংয়ের সফল ক্যাপচারটি নোট করুন।
আমি এটি ক্রোম এবং ফায়ারফক্সে পরীক্ষা করেছি, একটি ট্রিট কাজ করে!

যদি জানতে আগ্রহী আপনি Checkout পারেন আমি কি করছেন , এবং তার বিক্ষোভের
যদিও এটি কেবল ক্রোমে কাজ করে, কারণ ফায়ারফক্স ব্যাকরিফারেন্স বা নামযুক্ত গোষ্ঠীগুলিকে সমর্থন করে না। সুতরাং নোট করুন যে এই উত্তরে প্রদত্ত উদাহরণটি আসলে একটি নিচু সংস্করণ এবং সহজেই অবৈধ স্ট্রিং গ্রহণে জালিয়াতি পেতে পারে।


1
আপনার এটিকে
নোডজেএস

1
যদিও আমি নিজে এটি কখনও করি নি, এখানে একটি সুন্দর পুরো টিউটোরিয়াল রয়েছে: zellwk.com/blog/publish-to-npm । আমি পৃষ্ঠাটির শেষে এনপি পরীক্ষা করার পরামর্শ দেব। আমি এটি কখনও ব্যবহার করি নি, তবে সিন্ড্রে সোরাস এই জিনিসগুলির সাথে একজন যাদুকর, তাই আমি এটিটি পাস করব না।
rmobis

4

উপরের রেজেক্সে কিছু কালো স্ল্যাশ অনুপস্থিত যা সঠিকভাবে কাজ করছে না। সুতরাং, আমি রেজেক্স সম্পাদনা করেছি। ইমেল বৈধতার জন্য 99.99% কাজ করে এই রেজেক্স বিবেচনা করুন।

let EMAIL_REGEXP = 
new RegExp (['^(([^<>()[\\]\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\.,;:\\s@\"]+)*)',
                    '|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.',
                    '[0-9]{1,3}\])|(([a-zA-Z\\-0-9]+\\.)+',
                    '[a-zA-Z]{2,}))$'].join(''));

1

অ্যারে এড়াতে join, আপনি নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করতে পারেন:

var pattern = new RegExp('^(([^<>()[\]\\.,;:\s@\"]+' +
  '(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@' +
  '((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|' +
  '(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$');

0

ব্যক্তিগতভাবে, আমি একটি কম জটিল রেজেক্সের জন্য যাব:

/\S+@\S+\.\S+/

অবশ্যই, এটি আপনার বর্তমান প্যাটার্নের চেয়ে কম সঠিক , তবে আপনি কী সম্পাদন করার চেষ্টা করছেন? আপনার ব্যবহারকারীরা প্রবেশ করতে পারে এমন দুর্ঘটনাজনিত ত্রুটিগুলি ধরার চেষ্টা করছেন, বা আপনার ব্যবহারকারীরা অবৈধ ঠিকানা প্রবেশের চেষ্টা করতে পারে বলে আপনি কি উদ্বিগ্ন? এটি যদি প্রথম হয় তবে আমি আরও সহজ প্যাটার্নে যাব। যদি এটি পরে থাকে তবে সেই ঠিকানায় প্রেরিত কোনও ই-মেইলে প্রতিক্রিয়া জানাতে কিছু যাচাই করা আরও ভাল বিকল্প হতে পারে।

তবে আপনি যদি আপনার বর্তমান প্যাটার্নটি ব্যবহার করতে চান তবে এটির মতো ছোট ছোট সাব-প্যাটার্নগুলি তৈরি করে (আইএমও) পড়া (এবং বজায় রাখা!) আরও সহজ হবে:

var box1 = "([^<>()[\]\\\\.,;:\s@\"]+(\\.[^<>()[\\]\\\\.,;:\s@\"]+)*)";
var box2 = "(\".+\")";

var host1 = "(\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])";
var host2 = "(([a-zA-Z\-0-9]+\\.)+[a-zA-Z]{2,})";

var regex = new RegExp("^(" + box1 + "|" + box2 + ")@(" + host1 + "|" + host2 + ")$");

21
ডাউনভোটিং - যদিও রেজেক্স জটিলতা হ্রাস সম্পর্কে আপনার মন্তব্যগুলি বৈধ, তবে ওপি বিশেষত কীভাবে "একাধিক লাইনের উপর দীর্ঘ রেজেক্সকে বিভক্ত করতে" তা জিজ্ঞাসা করছে। সুতরাং আপনার পরামর্শটি বৈধ হলেও এটি ভুল কারণে দেওয়া হয়েছে। যেমন প্রোগ্রামিং ভাষার চারপাশে কাজ করার জন্য ব্যবসায়ের যুক্তি পরিবর্তন করা changing তদুপরি, আপনার দেওয়া কোড উদাহরণটি বেশ কুৎসিত।
স্লিডক্যাল

4
@ স্লিপাইকাল আমার ধারণা বার্ট প্রশ্নের উত্তর দিয়েছেন। তার উত্তরের শেষ বিভাগটি দেখুন। তিনি প্রশ্নের উত্তর দেওয়ার পাশাপাশি একটি বিকল্পও দিয়েছেন।
নিধিন ডেভিড

0

আপনি কেবল স্ট্রিং অপারেশন ব্যবহার করতে পারেন।

var pattenString = "^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|"+
"(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|"+
"(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$";
var patten = new RegExp(pattenString);

0

আমি সবকিছুর সজ্জিত করে এবং ক্যাপচার গ্রুপ এবং চরিত্রের সেটগুলি বিভক্ত করার জন্য সমর্থন বাস্তবায়নের মাধ্যমে করুনের উত্তরকে উন্নত করার চেষ্টা করেছি - এই পদ্ধতিটিকে আরও বহুমুখী করে তুলছি।

এই স্নিপেটটি ব্যবহার করতে আপনাকে ভেরিয়াদিক ফাংশনটি কল করতে হবে combineRegex যার যুক্তিগুলি আপনাকে নিয়মিত অভিব্যক্তিগুলির একত্রিত করতে হবে। এর বাস্তবায়ন নীচে পাওয়া যাবে।

ক্যাপচারিং গ্রুপগুলি সরাসরি সেভাবে বিভক্ত করা যায় না যদিও এটি কেবলমাত্র একটি প্রথম বন্ধনীর সাথে কিছু অংশ ছেড়ে যায়। আপনার ব্রাউজার ব্যতিক্রম ব্যর্থ হবে।

পরিবর্তে আমি কেবল অ্যারের ভিতরে ক্যাপচার গ্রুপের বিষয়বস্তুগুলি পার করছি। বন্ধনী স্বয়ংক্রিয়ভাবে যুক্ত করা হয় যখনcombineRegexএকটি অ্যারের মুখোমুখি ।

তদুপরি কোয়ান্টিফায়ারদের কিছু অনুসরণ করা দরকার। যদি কোনও কারণে নিয়মিত প্রকাশকে কোয়ান্টিফায়ারের সামনে বিভক্ত করতে হয় তবে আপনাকে এক জোড়া বন্ধনী যুক্ত করতে হবে। এগুলি স্বয়ংক্রিয়ভাবে সরানো হবে। মুল বক্তব্যটি হ'ল একটি খালি ক্যাপচার গ্রুপটি বেশ ব্যবহারহীন এবং এই পথে কোয়ান্টিফায়ারদের উল্লেখ করার মতো কিছু আছে। নন-ক্যাপচারিং গ্রুপগুলির মতো জিনিসগুলির জন্য একই পদ্ধতি ব্যবহার করা যেতে পারে ( /(?:abc)/হয়ে যায়)[/()?:abc/] ) এর ।

এটি একটি সাধারণ উদাহরণ ব্যবহার করে সর্বোত্তমভাবে ব্যাখ্যা করা হয়েছে:

var regex = /abcd(efghi)+jkl/;

হবে:

var regex = combineRegex(
    /ab/,
    /cd/,
    [
        /ef/,
        /ghi/
    ],
    /()+jkl/    // Note the added '()' in front of '+'
);

যদি আপনাকে অবশ্যই অক্ষর সেটগুলি বিভক্ত করতে হয় তবে আপনি {"":[regex1, regex2, ...]}অ্যারে ( [regex1, regex2, ...]) এর পরিবর্তে অবজেক্ট ( ) ব্যবহার করতে পারেন । কীটির বিষয়বস্তু যতক্ষণ অবজেক্টটিতে কেবল একটি চাবি থাকে ততক্ষণ কিছু হতে পারে। মনে রাখবেন পরিবর্তে ()আপনার পরিবর্তে ]ডামি শুরু হিসাবে ব্যবহার করতে হবে যদি প্রথম চরিত্রটি কোয়ান্টিফায়ার হিসাবে ব্যাখ্যা করা যায়। অর্থাৎ /[+?]/হয়ে যায়{"":[/]+?/]}

এখানে স্নিপেট এবং আরও একটি সম্পূর্ণ উদাহরণ:

function combineRegexStr(dummy, ...regex)
{
    return regex.map(r => {
        if(Array.isArray(r))
            return "("+combineRegexStr(dummy, ...r).replace(dummy, "")+")";
        else if(Object.getPrototypeOf(r) === Object.getPrototypeOf({}))
            return "["+combineRegexStr(/^\]/, ...(Object.entries(r)[0][1]))+"]";
        else 
            return r.source.replace(dummy, "");
    }).join("");
}
function combineRegex(...regex)
{
    return new RegExp(combineRegexStr(/^\(\)/, ...regex));
}

//Usage:
//Original:
console.log(/abcd(?:ef[+A-Z0-9]gh)+$/.source);
//Same as:
console.log(
  combineRegex(
    /ab/,
    /cd/,
    [
      /()?:ef/,
      {"": [/]+A-Z/, /0-9/]},
      /gh/
    ],
    /()+$/
  ).source
);


0

@ হ্যাশব্রাউন এর দুর্দান্ত উত্তর আমাকে সঠিক পথে পেয়েছে। এই ব্লগটি দ্বারা অনুপ্রাণিত আমার সংস্করণটি এখানে ।

function regexp(...args) {
  function cleanup(string) {
    // remove whitespace, single and multi-line comments
    return string.replace(/\s+|\/\/.*|\/\*[\s\S]*?\*\//g, '');
  }

  function escape(string) {
    // escape regular expression
    return string.replace(/[-.*+?^${}()|[\]\\]/g, '\\$&');
  }

  function create(flags, strings, ...values) {
    let pattern = '';
    for (let i = 0; i < values.length; ++i) {
      pattern += cleanup(strings.raw[i]);  // strings are cleaned up
      pattern += escape(values[i]);        // values are escaped
    }
    pattern += cleanup(strings.raw[values.length]);
    return RegExp(pattern, flags);
  }

  if (Array.isArray(args[0])) {
    // used as a template tag (no flags)
    return create('', ...args);
  }

  // used as a function (with flags)
  return create.bind(void 0, args[0]);
}

এটি এর মতো ব্যবহার করুন:

regexp('i')`
  //so this is a regex

  //here I am matching some numbers
  (\d+)

  //Oh! See how I didn't need to double backslash that \d?
  ([a-z]{1,3}) /*note to self, this is group #2*/
`

এই RegExpঅবজেক্টটি তৈরি করতে :

/(\d+)([a-z]{1,3})/i
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.