javascript - কিভাবে আপনি একটি জাভাস্ক্রিপ্ট নিয়মিত অভিব্যক্তি মধ্যে মিলিত গ্রুপ অ্যাক্সেস করবেন?




regex (9)

পরিভাষা এই উত্তর ব্যবহৃত হয়:

  • ম্যাচ আপনার স্ট্রিংয়ের বিরুদ্ধে আপনার রেজেক্স প্যাটার্ন চালানোর ফলাফল নির্দেশ করে: someString.match(regexPattern)
  • মিলযুক্ত নিদর্শন ইনপুট স্ট্রিং এর সব মিলযুক্ত অংশ নির্দেশ করে, যা সমস্ত ম্যাচ অ্যারের মধ্যে থাকে। এই ইনপুট স্ট্রিং ভিতরে আপনার প্যাটার্ন সব দৃষ্টান্ত।
  • মিলিত গ্রুপগুলি রেগেক্স প্যাটার্নে সংজ্ঞায়িত সমস্ত গোষ্ঠীকে ধরতে নির্দেশ করে। (বন্ধনীগুলির ভিতরে নিদর্শন, যেমন: /format_(.*?)/g , যেখানে (.*?) একটি /format_(.*?)/g গোষ্ঠী হবে।) এটি /format_(.*?)/g নিদর্শনগুলির মধ্যে থাকে

বিবরণ

মিলযুক্ত গোষ্ঠীগুলিতে অ্যাক্সেস পেতে, প্রতিটি মিলিত নকশার মধ্যে , আপনার একটি ফাংশন বা অনুরূপ কিছু মিলের সাথে পুনরাবৃত্তি করতে হবে। আপনি উত্তর দিতে পারেন এমন অনেকগুলি উপায় রয়েছে, যেহেতু অন্যান্য উত্তরগুলি দেখায়। সর্বাধিক অন্যান্য উত্তরগুলি একটি লুপের সাথে সমস্ত মিলযুক্ত নকশার উপর পুনরাবৃত্তি করার জন্য ব্যবহার করে , তবে আমি মনে করি আমরা সবাই সেই পদ্ধতির সম্ভাব্য বিপদগুলি জানি। এটি কেবলমাত্র প্যাটার্নের পরিবর্তে একটি new RegExp() সাথে মেলে, এটি শুধুমাত্র একটি মন্তব্যে উল্লেখ করা হয়েছে। এই কারণে .exec() পদ্ধতি একটি জেনারেটরের ফাংশনের অনুরূপ আচরণ করে - এটি একটি ম্যাচ থাকলে প্রতিবার বন্ধ থাকে , তবে এটি .exec() কল থেকে এটি চালিয়ে যেতে .lastIndex রাখে।

কোড উদাহরণ

নীচে একটি ফাংশন অনুসন্ধান searchString একটি উদাহরণ যা সমস্ত searchString নকশার একটি Array প্রদান করে , যেখানে প্রতিটি match রয়েছে সমস্ত সমন্বিত searchString গোষ্ঠীগুলির সাথে একটি Array । একটি লুপ ব্যবহার করার পরিবর্তে, আমি -রুপের for একটি প্লেইন ব্যবহার করে, Array.prototype.map() ফাংশন এবং আরও বেশি কার্যকর উপায় ব্যবহার করে উদাহরণ সরবরাহ করেছি।

সংক্ষিপ্ত সংস্করণ (কম কোড, আরো সিনট্যাক্টিক চিনি)

এইগুলি কম কার্যকরী কারণ তারা মৌলিকভাবে forEach for দ্রুত পরিবর্তনের for একটি forEach লুপ প্রয়োগ করে।

// Concise ES6/ES2015 syntax
const searchString = 
    (string, pattern) => 
        string
        .match(new RegExp(pattern.source, pattern.flags))
        .map(match => 
            new RegExp(pattern.source, pattern.flags)
            .exec(match));

// Or if you will, with ES5 syntax
function searchString(string, pattern) {
    return string
        .match(new RegExp(pattern.source, pattern.flags))
        .map(match =>
            new RegExp(pattern.source, pattern.flags)
            .exec(match));
}

let string = "something format_abc",
    pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;

let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag

পারফরম্যান্ট সংস্করণ (আরো কোড, কম সিনট্যাক্টিক চিনি)

// Performant ES6/ES2015 syntax
const searchString = (string, pattern) => {
    let result = [];

    const matches = string.match(new RegExp(pattern.source, pattern.flags));

    for (let i = 0; i < matches.length; i++) {
        result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
    }

    return result;
};

// Same thing, but with ES5 syntax
function searchString(string, pattern) {
    var result = [];

    var matches = string.match(new RegExp(pattern.source, pattern.flags));

    for (var i = 0; i < matches.length; i++) {
        result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
    }

    return result;
}

let string = "something format_abc",
    pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;

let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag

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

আমি একটি নিয়মিত অভিব্যক্তি ব্যবহার করে একটি স্ট্রিং এর একটি অংশ মেলে এবং তারপরে যে বন্ধনীযুক্ত সাবস্ট্রিং অ্যাক্সেস করতে চান:

var myString = "something format_abc"; // I want "abc"

var arr = /(?:^|\s)format_(.*?)(?:\s|$)/.exec(myString);

console.log(arr);     // Prints: [" format_abc", "abc"] .. so far so good.
console.log(arr[1]);  // Prints: undefined  (???)
console.log(arr[0]);  // Prints: format_undefined (!!!)

আমি কি ভুল করছি?

আমি আবিষ্কার করেছি যে উপরে নিয়মিত এক্সপ্রেশন কোডের সাথে কিছু ভুল ছিল না: আমি যে সত্য স্ট্রিংটি পরীক্ষা করছিলাম সেটি হল:

"date format_%A"

"% A" অনির্ধারিত বলে রিপোর্ট করা একটি খুব অদ্ভুত আচরণ বলে মনে হচ্ছে, তবে এটি সরাসরি এই প্রশ্নের সাথে সম্পর্কিত নয়, তাই আমি একটি নতুন খোলা করেছি, কেন জাভাস্ক্রিপ্টে একটি মিলযুক্ত সাবস্ট্রিং "অনির্ধারিত" ফিরে আসছে?

সমস্যাটি হল console.log তার console.log স্টেটমেন্টের মতো প্যারামিটারগুলি নেয় এবং যে স্ট্রিংটি আমি লগিং করছিলাম সেটি ছিল "%A" ( "%A" ) একটি বিশেষ মান ছিল, এটি পরবর্তী প্যারামিটারের মান খুঁজে বের করার চেষ্টা করছিল।


আপনার কোড ব্যবহার করে:

console.log(arr[1]);  // prints: abc
console.log(arr[0]);  // prints:  format_abc

সম্পাদনা: সাফারি 3, এটি গুরুত্বপূর্ণ।


আপনার সিনট্যাক্স সম্ভবত রাখা ভাল নয়। FF / Gecko ফাংশন একটি এক্সটেনশান হিসাবে RegExp সংজ্ঞায়িত করে।
(FF2 টাইপফোনের typeof(/pattern/) == 'function' )

মনে হচ্ছে এটি এফএফ-আইই, অপেরা, এবং ক্রোমের জন্য নির্দিষ্ট কিছু ব্যতিক্রম।

পরিবর্তে, অন্যদের দ্বারা পূর্বে উল্লেখ পদ্ধতিটি ব্যবহার করুন: RegExp#exec বা RegExp#exec String#match
তারা একই ফলাফল প্রস্তাব:

var regex = /(?:^|\s)format_(.*?)(?:\s|$)/;
var input = "something format_abc";

regex(input);        //=> [" format_abc", "abc"]
regex.exec(input);   //=> [" format_abc", "abc"]
input.match(regex);  //=> [" format_abc", "abc"]

আপনি এই মত ক্যাপচার গ্রুপ অ্যাক্সেস করতে পারেন:

var myString = "something format_abc";
var myRegexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
var match = myRegexp.exec(myString);
console.log(match[1]); // abc

এবং একাধিক মিল আছে যদি আপনি তাদের উপর পুনরাবৃত্তি করতে পারেন:

var myString = "something format_abc";
var myRegexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
match = myRegexp.exec(myString);
while (match != null) {
  // matched text: match[0]
  // match start: match.index
  // capturing group n: match[n]
  console.log(match[0])
  match = myRegexp.exec(myString);
}


এখানে একটি পদ্ধতি যা আপনি প্রতিটি ম্যাচের জন্য এন ভি ক্যাপচারিং গ্রুপটি পেতে ব্যবহার করতে পারেন:

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'something format_abc something format_def something format_ghi';
var myRegEx = /(?:^|\s)format_(.*?)(?:\s|$)/g;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);


শুধুমাত্র একটি লাইনার যা আপনার কাছে একক জোড়া বন্ধনী থাকলেই ব্যবহারিক:

while ( ( match = myRegex.exec( myStr ) ) && matches.push( match[1] ) ) {};

exec পদ্ধতি চালু করার কোন প্রয়োজন নেই! আপনি স্ট্রিং সরাসরি "ম্যাচ" পদ্ধতি ব্যবহার করতে পারেন। শুধু বন্ধনী ভুলবেন না।

var str = "This is cool";
var matches = str.match(/(This is)( cool)$/);
console.log( JSON.stringify(matches) ); // will print ["This is cool","This is"," cool"] or something like that...

অবস্থান 0 সব ফলাফল সঙ্গে একটি স্ট্রিং আছে। পজিশন 1 দ্বারা প্রথম ম্যাচটি বন্ধ করে দেওয়া হয় এবং অবস্থান 2 আপনার বন্ধনীগুলিতে বিচ্ছিন্ন দ্বিতীয় ম্যাচ। নেস্টেড বন্ধনীগুলি চতুর, তাই সাবধান!


function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'Rs.200 is Debited to A/c ...2031 on 02-12-14 20:05:49 (Clear Bal Rs.66248.77) AT ATM. TollFree 1800223344 18001024455 (6am-10pm)';
var myRegEx = /clear bal.+?(\d+\.?\d{2})/gi;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'something format_abc something format_def something format_ghi';
var myRegEx = /(?:^|\s)format_(.*?)(?:\s|$)/g;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);


/*Regex function for extracting object from "window.location.search" string.
 */

var search = "?a=3&b=4&c=7"; // Example search string

var getSearchObj = function (searchString) {

    var match, key, value, obj = {};
    var pattern = /(\w+)=(\w+)/g;
    var search = searchString.substr(1); // Remove '?'

    while (match = pattern.exec(search)) {
        obj[match[0].split('=')[0]] = match[0].split('=')[1];
    }

    return obj;

};

console.log(getSearchObj(search));





regex