আপনি কীভাবে কোনও জাভাস্ক্রিপ্টের নিয়মিত প্রকাশে মিলিত গোষ্ঠীগুলিতে অ্যাক্সেস করবেন?


1368

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

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একটি printfস্টেটমেন্টের মতো প্যারামিটার নিয়েছে এবং যেহেতু আমি যে স্ট্রিংটিতে লগিং করছিলাম ( "%A") তার একটি বিশেষ মান ছিল তাই এটি পরবর্তী প্যারামিটারটির মান সন্ধান করার চেষ্টা করছিল।

উত্তর:


1673

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

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);
}

সম্পাদনা করুন: 2019-09-10

আপনি দেখতে পাচ্ছেন একাধিক ম্যাচে পুনরাবৃত্তি করার উপায়টি খুব স্বজ্ঞাত নয়। এটি String.prototype.matchAllপদ্ধতির প্রস্তাবের দিকে পরিচালিত করে । এই নতুন পদ্ধতিটি ইসমাস্ক্রিপ্ট 2020 স্পেসিফিকেশনে প্রেরণ করবে বলে আশা করা হচ্ছে । এটি আমাদের একটি পরিষ্কার এপিআই দেয় এবং একাধিক সমস্যা সমাধান করে। এটি বড় ব্রাউজার এবং জেএস ইঞ্জিনগুলিতে ক্রোম 73+ / নোড 12+ এবং ফায়ারফক্স 67+ হিসাবে অবতরণ করতে শুরু করা হয়েছে ।

পদ্ধতিটি একটি পুনরাবৃত্তিকে দেয় এবং নিম্নলিখিত হিসাবে ব্যবহৃত হয়:

const string = "something format_abc";
const regexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
const matches = string.matchAll(regexp);
    
for (const match of matches) {
  console.log(match);
  console.log(match.index)
}

এটি কোনও পুনরাবৃত্তিকে ফেরত দেওয়ার সাথে সাথে আমরা বলতে পারি যে এটি অলস, বিশেষত বিপুল সংখ্যক ক্যাপচারিং গ্রুপ, বা খুব বড় স্ট্রিং পরিচালনা করার সময় এটি কার্যকর। তবে আপনার যদি প্রয়োজন হয় তবে স্প্রেড সিনট্যাক্স বা Array.fromপদ্ধতিটি ব্যবহার করে ফলাফলটি সহজেই একটি অ্যারে রূপান্তরিত হতে পারে :

function getFirstGroup(regexp, str) {
  const array = [...str.matchAll(regexp)];
  return array.map(m => m[1]);
}

// or:
function getFirstGroup(regexp, str) {
  return Array.from(str.matchAll(regexp), m => m[1]);
}

ইতিমধ্যে, যখন এই প্রস্তাবটি আরও প্রশস্ত সমর্থন পেয়েছে, আপনি অফিসিয়াল শিম প্যাকেজটি ব্যবহার করতে পারেন ।

এছাড়াও, পদ্ধতির অভ্যন্তরীণ কাজগুলি সহজ। একটি জেনারেটর ফাংশন ব্যবহার করে একটি সমতুল্য বাস্তবায়ন নিম্নরূপ হবে:

function* matchAll(str, regexp) {
  const flags = regexp.global ? regexp.flags : regexp.flags + "g";
  const re = new RegExp(regexp, flags);
  let match;
  while (match = re.exec(str)) {
    yield match;
  }
}

মূল regexp একটি অনুলিপি তৈরি করা হয়; lastIndexএকাধিক ম্যাচের মধ্য দিয়ে যাওয়ার সময় সম্পত্তিটির পরিবর্তনের কারণে পার্শ্ব-প্রতিক্রিয়া এড়াতে এটি হয় ।

এছাড়াও, অনন্ত লুপ এড়াতে আমাদের রেজিপ্সের বিশ্ব পতাকা রয়েছে তা নিশ্চিত করতে হবে ensure

আমি এই দেখেও খুশি যে এই স্ট্যাকওভারফ্লো প্রশ্নটি প্রস্তাবের আলোচনায় রেফারেন্স করা হয়েছিল ।


114
+1 দয়া করে নোট করুন যে দ্বিতীয় উদাহরণে আপনার RegExp অবজেক্টটি ব্যবহার করা উচিত (কেবল "/ myregexp /" নয়), কারণ এটি অবজেক্টে সর্বশেষতম মূল্য রাখে। Regexp অবজেক্টটি ব্যবহার না করে এটি অসীমভাবে পুনরাবৃত্তি হবে
ianaz

7
@ আয়নাজ: আমি বিশ্বাস করি না সত্য? http://jsfiddle.net/weEg9/ কমপক্ষে Chrome এ কাজ করছে বলে মনে হচ্ছে।
spinningarrow

16
কেন পরিবর্তে উপরে করুন: var match = myString.match(myRegexp); // alert(match[1])?
অ্যালেন

29
সুস্পষ্ট "নতুন RegExp" দরকার নেই, তবে / g নির্দিষ্ট না করা পর্যন্ত অসীম লুপটি ঘটবে
জর্জ সি

4
অসীম লুপে না চলার আরেকটি উপায় হ'ল স্পষ্টভাবে স্ট্রিং আপডেট করা, যেমনstring = string.substring(match.index + match[0].length)
ওলগা

185

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

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);


12
এটি অন্যদের কাছে অনেক উচ্চতর উত্তর কারণ এটি সঠিকভাবে কেবল একটির পরিবর্তে সমস্ত ম্যাচেই পুনরাবৃত্তি প্রদর্শন করে।
রব ইভান্স

13
এমএনএন ঠিক আছে। 'জি' পতাকা উপস্থিত না থাকলে এটি একটি অসীম লুপ তৈরি করবে। এই ফাংশনটি সম্পর্কে খুব সতর্কতা অবলম্বন করুন।
দ্রুষ্কা

4
পাইথনের রি.ফাইন্ডল () এর অনুরূপ করার জন্য আমি এটি উন্নত করেছি। এটি সমস্ত ম্যাচগুলিকে অ্যারের অ্যারেতে ভাগ করে দেয়। এটি বৈশ্বিক সংশোধক অসীম লুপ ইস্যুও ঠিক করে। jsfiddle.net/ravishi/MbwpV
রবিশি

5
@ মিশেলমিকোভস্কি এখন আপনি কেবল আপনার অসীম লুপটি লুকিয়ে রেখেছেন, তবে আপনার কোডটি ধীরে চলবে। আমি যুক্তি দিয়ে বলছি যে কোডটি খারাপভাবে খারাপ হওয়া ভাল তাই আপনি এটি বিকাশে ধরতে পারেন। কিছু বিএস সর্বাধিক পুনরাবৃত্তি বিরতিতে রাখা হ'ল op ইস্যুগুলির মূল কারণগুলি ঠিক করার পরিবর্তে আড়াল করা উত্তর নয়।
ওয়াল্যাকার

4
আপনি যখন মৃত্যুদন্ড কার্যকর করার সীমাটি আঘাত করছেন না তখন @ মিশেলমিকোভস্কি যা অর্থপূর্ণভাবে ধীর হয় না। আপনি যখন, এটি স্পষ্টভাবে অনেক ধীর। আমি বলছি না যে আপনার কোডটি কাজ করে না, আমি বলছি যে অনুশীলনে আমার মনে হয় এটি ভালের চেয়ে আরও বেশি ক্ষতির কারণ হবে। কোনও পরিবেশ পরিবেশে কাজ করা লোকেরা কোডের কিছু অংশের 10,000 টি অযথা মৃত্যুদণ্ড কার্যকর করেও কোডটি কোনও লোডের অধীনে কোডটি সূক্ষ্মভাবে কাজ করতে দেখবে। তারপরে তারা এটিকে উত্পাদন পরিবেশে ফেলে দেবে এবং আশ্চর্য হবে যে কেন তাদের অ্যাপ লোডের নিচে নেমে যায়। আমার অভিজ্ঞতায় জিনিসগুলি একটি সুস্পষ্ট উপায়ে এবং তার আগে বিকাশের চক্রের মধ্যে ভাঙা ভাল।
ওয়ালাকার

58

var myString = "something format_abc";
var arr = myString.match(/\bformat_(.*?)\b/);
console.log(arr[0] + " " + arr[1]);

\bঠিক একই জিনিস না। (এটি কাজ করে --format_foo/, তবে কাজ করে না format_a_b) তবে আমি আপনার অভিব্যক্তির বিকল্পটি দেখাতে চেয়েছিলাম, যা ভাল। অবশ্যই, matchকলটি গুরুত্বপূর্ণ বিষয়।


2
এটা ঠিক বিপরীত। '\ বি' শব্দগুলি সীমিত করে। শব্দ = '\ ডাব্লু' = [a-zA-Z0-9_]। "format_a_b" একটি শব্দ।
বিএফ

1
@ বিএফনিস্টলি, আমি format_a_b6 বছর আগে চিন্তাভাবনা হিসাবে " কাজ করে না" যুক্ত করেছি এবং আমি সেখানে কী বোঝাতে চাইছিলাম তা মনে করতে পারছি না ... :-) আমার মনে হয় এর অর্থ " aকেবল ক্যাপচারে কাজ করে না ", অর্থাত। প্রথম বর্ণানুক্রমিক অংশ পরে format_
ফিলিহো

1
আমি বলতে চেয়েছিলাম যে \ b (- format_foo /} \ b "" ফর্ম্যাট_ফু / "ফিরে আসে না কারণ" - "এবং" / "কোনও \ শব্দের অক্ষর নয় But বি (format_a_b) \ b" ফর্ম্যাট_এ_বি "ঠিক আছে? আমি আপনার পাঠ্য বিবৃতিটি বৃত্তাকার বন্ধনীগুলিতে উল্লেখ করি ((কোন ভোট দেয় নি!)
বিএফ

31

উপরের মাল্টি-ম্যাচের প্রথম বন্ধনীর উদাহরণগুলির ক্ষেত্রে, আমি যা চেয়েছিলাম তা না পেয়ে আমি এখানে উত্তর খুঁজছিলাম:

var matches = mystring.match(/(?:neededToMatchButNotWantedInResult)(matchWanted)/igm);

উপরের সময় এবং .push () এর সাথে সামান্য সংশ্লেষিত ফাংশন কলগুলি দেখার পরে, এটি আমার উপর ছড়িয়ে পড়ে যে পরিবর্তে মাইস্ট্রিং.রেপ্লেস () এর পরিবর্তে সমস্যাটি খুব সুন্দরভাবে সমাধান করা যেতে পারে (প্রতিস্থাপনটি বিন্দু নয়, এমনকি এটিও করা হয়নি) , পরিষ্কার, দ্বিতীয় প্যারামিটারের জন্য অন্তর্নির্মিত পুনরাবৃত্ত ফাংশন কল বিকল্পটি!):

var yourstring = 'something format_abc something format_def something format_ghi';

var matches = [];
yourstring.replace(/format_([^\s]+)/igm, function(m, p1){ matches.push(p1); } );

এর পরে, আমি কখনও মনে করি না যে আমি আর কখনও মেশিন () ব্যবহার করতে যাচ্ছি।


26

সর্বশেষে তবে কমপক্ষে, আমি কোডের একটি লাইন পেয়েছি যা আমার পক্ষে ভাল কাজ করেছে (জেএস ইএস 6):

let reg = /#([\S]+)/igm; // Get hashtags.
let string = 'mi alegría es total! ✌🙌\n#fiestasdefindeaño #PadreHijo #buenosmomentos #france #paris';

let matches = (string.match(reg) || []).map(e => e.replace(reg, '$1'));
console.log(matches);

এটি ফিরে আসবে:

['fiestasdefindeaño', 'PadreHijo', 'buenosmomentos', 'france', 'paris']

1
গম্ভীর গর্জন! এটা সবচেয়ে মার্জিত সমাধান এখানে। আমি এটি আলেকজ -এর পূর্ণ অন পদ্ধতির চেয়ে ভাল দেখতে পেয়েছি কারণ এটি একাধিক ফলাফলের জন্য কম চেহারা-এগিয়ে এবং আরও মার্জিত। এটিতে ভাল কাজ, সেবাস্তিয়ান এইচ।replace
কোডি

এটি এত ভালভাবে কাজ করে যে এটি অবশ্যই আমার কাজে লাগবে :)
কোডি

1
@ কোডি ধন্যবাদ মানুষ!
সেবাস্তিয়ান এইচ।

19

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

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

বিবরণ

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

কোড উদাহরণ

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

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

এগুলি কম সম্পাদনযোগ্য যেহেতু তারা মূলত একটি প্রয়োগ করে implement forEach দ্রুত- forলুপের পরিবর্তে লুপ করে ।

// 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

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


19

String#matchAll( পর্যায় 3 খসড়া / ডিসেম্বর 7, 2018 এর প্রস্তাব দেখুন ), ম্যাচ অবজেক্টের সমস্ত গ্রুপের জন্য আরামকে সহজ করে তোলে (মনে রাখবেন গ্রুপ 0 পুরো ম্যাচ, অন্য গ্রুপগুলি প্যাটার্নে ক্যাপচারকারী গ্রুপগুলির সাথে মিল রাখে):

সঙ্গে matchAllউপলব্ধ করুন, আপনার এড়াতে পারেন whileলুপ এবং execসঙ্গে /g... পরিবর্তে, ব্যবহার করে matchAll, আপনি ফিরে কোনো ইটারেটরে যা আপনি আরও বেশি সুবিধাজনক সাথে ব্যবহার করতে পারেন পেতে for...of, অ্যারে বিস্তার , অথবা Array.from()নির্মান

এই পদ্ধতিটি পাইথনের Regex.Matchesসি # তে অনুরূপ আউটপুট দেয় re.finditer,preg_match_all পিএইচপি- ।

একটি জেএস ডেমো দেখুন (গুগল ক্রোমে tested৩.০.68683৩..67 (অফিসিয়াল বিল্ড), বিটা (-৪-বিট) পরীক্ষিত):

var myString = "key1:value1, key2-value2!!@key3=value3";
var matches = myString.matchAll(/(\w+)[:=-](\w+)/g);
console.log([...matches]); // All match with capturing group values

console.log([...matches])শো

এখানে চিত্র বর্ণনা লিখুন

আপনি ম্যাচ মান বা নির্দিষ্ট গ্রুপ মান ব্যবহার করেও পেতে পারেন

let matchData = "key1:value1, key2-value2!!@key3=value3".matchAll(/(\w+)[:=-](\w+)/g)
var matches = [...matchData]; // Note matchAll result is not re-iterable

console.log(Array.from(matches, m => m[0])); // All match (Group 0) values
// => [ "key1:value1", "key2-value2", "key3=value3" ]
console.log(Array.from(matches, m => m[1])); // All match (Group 1) values
// => [ "key1", "key2", "key3" ]

দ্রষ্টব্য : ব্রাউজারের সামঞ্জস্যের বিশদটি দেখুন।


কী মান জোড়ার জন্য নিখুঁত উদাহরণ। সংক্ষিপ্ত এবং পড়া সহজ, ব্যবহার করা খুব সহজ। এছাড়াও, আরও ভাল ত্রুটি পরিচালনার জন্য, স্প্রেড শূন্যের চেয়ে খালি অ্যারে ফিরিয়ে দেবে, সুতরাং আর 'ত্রুটি হবে না, কোনও সম্পত্তি "নালার" দৈর্ঘ্য "নেই
জারোদ ম্যাকগুইয়ার

17

আপনার সিনট্যাক্স সম্ভবত রাখার জন্য সেরা নয়। এফএফ / গেকো ফাংশনের একটি এক্সটেনশন হিসাবে রেজিএক্সপকে সংজ্ঞায়িত করে।
(এফএফ 2 যতদূর গেছে typeof(/pattern/) == 'function')

দেখে মনে হচ্ছে এটি এফএফ - আইই, অপেরা এবং ক্রোমের সাথে সুনির্দিষ্ট all

পরিবর্তে, অন্যদের দ্বারা উল্লিখিত যে কোনও পদ্ধতি ব্যবহার করুন: 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"]

16

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 এর দ্বিতীয় ম্যাচটি আপনার বন্ধনীগুলির মধ্যে পৃথক রয়েছে। নেস্টেড প্রথম বন্ধনীগুলি কৌশলযুক্ত, তাই সাবধান!


4
গ্লোবাল পতাকা ব্যতীত এটি সমস্ত ম্যাচ ফেরত দেয়, এটির সাথে, আপনি কেবল একটি বড় একটি পেয়ে যাবেন তাই এটির জন্য নজর রাখুন।
শাদিমিল্কম্যান01

8

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

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

4
কেন নয়while (match = myRegex.exec(myStr)) matches.push(match[1])
উইল্লমা 18

7

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

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

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


7

Es2018 এর সাহায্যে আপনি এখন নামী String.match()গোষ্ঠীগুলির সাথে করতে পারেন, আপনার রেজেক্সকে এটি করার চেষ্টা করছে তার আরও স্পষ্ট করে তোলে।

const url =
  '/programming/432493/how-do-you-access-the-matched-groups-in-a-javascript-regular-expression?some=parameter';
const regex = /(?<protocol>https?):\/\/(?<hostname>[\w-\.]*)\/(?<pathname>[\w-\./]+)\??(?<querystring>.*?)?$/;
const { groups: segments } = url.match(regex);
console.log(segments);

এবং আপনি কিছু পাবেন

{প্রোটোকল: "https", হোস্টনাম: "স্ট্যাকওভারফ্লো ডট কম", পথের নাম: "প্রশ্নগুলি / 432493 / আপনি কীভাবে-মেলানো-গোষ্ঠীগুলিতে একটি জাভাস্ক্রিপ্ট-নিয়মিত-এক্সপ্রেশন", ক্যোরিস্টিং: " কিছু = প্যারামিটার "}


6

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);


3

আপনার কোড আমার জন্য ম্যাক (এফএফ 3 ম্যাকের জন্য) কাজ করে এমনকি আমি ফিলোর সাথে একমত হয়েছি যে সম্ভবত রেজেক্স হওয়া উচিত:

/\bformat_(.*?)\b/

(তবে অবশ্যই আমি নিশ্চিত নই কারণ আমি রেইজেক্সের প্রসঙ্গটি জানি না।)


1
এটি একটি স্থান-বিচ্ছিন্ন তালিকা যাতে আমি অনুভব করি যে ভাল হবে। আশ্চর্যজনক যে কোডটি আমার পক্ষে কাজ করছে না (এফএফ 3 ভিস্তা)
নিকফ

1
হ্যাঁ, সত্যই অদ্ভুত। আপনি কি এটি ফায়ারব্যাগ কনসোলে নিজে চেষ্টা করেছেন? অন্যথায় খালি পৃষ্ঠা থেকে আমি বোঝাতে চাইছি।
PEZ

2
/*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));

2

একাধিক ম্যাচ পার্স করার জন্য আপনার প্রকৃতপক্ষে স্পষ্ট লুপের প্রয়োজন নেই - বর্ণিত হিসাবে দ্বিতীয় আর্গুমেন্ট হিসাবে একটি প্রতিস্থাপন ফাংশনটি পাস করুন String.prototype.replace(regex, func):

var str = "Our chief weapon is {1}, {0} and {2}!"; 
var params= ['surprise', 'fear', 'ruthless efficiency'];
var patt = /{([^}]+)}/g;

str=str.replace(patt, function(m0, m1, position){return params[parseInt(m1)];});

document.write(str);

m0যুক্তি পূর্ণ মিলেছে সাবস্ট্রিং প্রতিনিধিত্ব করে {0}, {1}ইত্যাদি m1প্রথম ম্যাচিং গ্রুপ, অর্থাত অংশ Regex যা মধ্যে বন্ধনীর মধ্যে ঘিরা প্রতিনিধিত্ব করে 0প্রথম ম্যাচের জন্য। এবং positionস্ট্রিংয়ের মধ্যে শুরু সূচকটি যেখানে মিলছে গ্রুপটি পাওয়া গেছে - এক্ষেত্রে অব্যবহৃত।


1

আমরা ব্যাকস্ল্যাশ ব্যবহার করে মেলানো গ্রুপের সংখ্যাটি ব্যবহার করে একটি নিয়মিত প্রকাশে মিলিত গোষ্ঠীটি অ্যাক্সেস করতে পারি:

/([a-z])\1/

কোডটিতে \ 1 প্রতিনিধিত্ব করে প্রথম গোষ্ঠীর ([এজেড))


1

একটি লাইন সমাধান:

const matches = (text,regex) => [...text.matchAll(regex)].map(([match])=>match)

সুতরাং আপনি এইভাবে ব্যবহার করতে পারেন (অবশ্যই ব্যবহার করতে হবে / ছ):

matches("something format_abc", /(?:^|\s)format_(.*?)(?:\s|$)/g)

ফলাফল:

[" format_abc"]


0

আমি আপনি আমার মত এবং ইচ্ছে করে রেজেক্স এইরকম একটি অবজেক্ট ফিরিয়ে দেবে:

{
    match: '...',
    matchAtIndex: 0,
    capturedGroups: [ '...', '...' ]
}

তারপরে নীচে থেকে ফাংশনটি স্নিপ করুন

/**
 * @param {string | number} input
 *          The input string to match
 * @param {regex | string}  expression
 *          Regular expression 
 * @param {string} flags
 *          Optional Flags
 * 
 * @returns {array}
 * [{
    match: '...',
    matchAtIndex: 0,
    capturedGroups: [ '...', '...' ]
  }]     
 */
function regexMatch(input, expression, flags = "g") {
  let regex = expression instanceof RegExp ? expression : new RegExp(expression, flags)
  let matches = input.matchAll(regex)
  matches = [...matches]
  return matches.map(item => {
    return {
      match: item[0],
      matchAtIndex: item.index,
      capturedGroups: item.length > 1 ? item.slice(1) : undefined
    }
  })
}

let input = "key1:value1, key2:value2 "
let regex = /(\w+):(\w+)/g

let matches = regexMatch(input, regex)

console.log(matches)


0

কেবলমাত্র নিবন্ধটি ব্যবহার করুন $ 1 ... $ n তম গ্রুপ যেমন:

1. প্রথম গ্রুপের রেজিপ্লেক্সের সাথে মেলে। $ 1

  1. ২ য় গ্রুপের রেজিপ্লেক্সের সাথে মেলে To 2

আপনি যদি রেজিেক্স লাইকটিতে 3 টি গোষ্ঠী ব্যবহার করেন (স্ট্রিং.ম্যাচ (রেজেেক্স) এর পরে নোট ব্যবহার করুন)

RegExp। Reg 1 RegExp। Reg 2 RegExp। $ 3

 var str = "The rain in ${india} stays safe"; 
  var res = str.match(/\${(.*?)\}/ig);
  //i used only one group in above example so RegExp.$1
console.log(RegExp.$1)

//easiest way is use RegExp.$1 1st group in regex and 2nd grounp like
 //RegExp.$2 if exist use after match

var regex=/\${(.*?)\}/ig;
var str = "The rain in ${SPAIN} stays ${mainly} in the plain"; 
  var res = str.match(regex);
for (const match of res) {
  var res = match.match(regex);
  console.log(match);
  console.log(RegExp.$1)
 
}

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