RegExp.exec ব্যবহার করে স্ট্রিং থেকে সমস্ত মিল খুঁজে পাওয়ার জন্য RegEx


175

আমি নিম্নলিখিত ধরণের স্ট্রিংকে বিশ্লেষণের চেষ্টা করছি:

[key:"val" key2:"val2"]

যেখানে নির্বিচারে কী রয়েছে: ভিতরে "ভাল" জোড়া। আমি মূল নাম এবং মানটি ধরতে চাই। যারা আগ্রহী তাদের জন্য আমি টাস্ক যোদ্ধার ডাটাবেস ফর্ম্যাটটি পার্স করার চেষ্টা করছি।

এখানে আমার পরীক্ষার স্ট্রিং রয়েছে:

[description:"aoeu" uuid:"123sth"]

যা হাইলাইট করে বোঝানো হচ্ছে যে কোনও কিছু স্থান থেকে আলাদা কী বা মূল্যের মধ্যে থাকতে পারে, কোলনের চারপাশে কোনও ফাঁকা স্থান নেই, এবং মানগুলি সর্বদা ডাবল উদ্ধৃতিতে থাকে।

নোডে, এটি আমার আউটপুট:

[deuteronomy][gatlin][~]$ node
> var re = /^\[(?:(.+?):"(.+?)"\s*)+\]$/g
> re.exec('[description:"aoeu" uuid:"123sth"]');
[ '[description:"aoeu" uuid:"123sth"]',
  'uuid',
  '123sth',
  index: 0,
  input: '[description:"aoeu" uuid:"123sth"]' ]

তবে description:"aoeu"এই প্যাটার্নটিও মেলে। আমি কীভাবে সমস্ত ম্যাচ ফিরে পেতে পারি?


এটি হতে পারে যে আমার রেজেক্সটি ভুল এবং / অথবা আমি কেবল জাভাস্ক্রিপ্টে রেগেক্স সুবিধাগুলি ভুলভাবে ব্যবহার করছি। এটি কাজ করে বলে মনে হচ্ছে:> var s = "পনেরটি 15 এবং আটটি 8"; > var re = / \ d + / g; > var m = s.match (re); মি = ['15', '8']
গাটলিন

6
জাভাস্ক্রিপ্টের এখন একটি। ম্যাচ () ফাংশন রয়েছে: বিকাশকারী.মোজিলা.আর.ইন.ইউএস / "some string".match(/regex/g)
ডকস

উত্তর:


237

re.exec(s)সমস্ত ম্যাচ পাওয়ার জন্য একটি লুপে কল করা চালিয়ে যান :

var re = /\s*([^[:]+):\"([^"]+)"/g;
var s = '[description:"aoeu" uuid:"123sth"]';
var m;

do {
    m = re.exec(s);
    if (m) {
        console.log(m[1], m[2]);
    }
} while (m);

এই জেএসফিডাল দিয়ে এটি ব্যবহার করে দেখুন: https://jsfiddle.net/7yS2V/


8
whileতার বদলে কেন হবে না do … while?
গম্বো

15
কিছুক্ষণের জন্য লুপটি ব্যবহার করে এটি এম শুরু করতে কিছুটা বিশ্রী হয়ে যায়। আপনাকে হয় লিখতে হবে while(m = re.exec(s)), যা একটি অ্যান্টি-প্যাটার্ন আইএমও, বা আপনাকে লিখতে হবে m = re.exec(s); while (m) { ... m = re.exec(s); }। আমি do ... if ... whileআইডিয়োমকে পছন্দ করি তবে অন্যান্য কৌশলগুলিও কাজ করবে।
ল্যান্সিয়া

14
ক্রোমিয়ামে এটি করার ফলে আমার ট্যাব ক্রাশ হয়ে গেছে।
এজক্যাসবার্গ

47
@ এডজক্যাসবার্গ আপনার gপতাকা সেট থাকা দরকার, অন্যথায় অভ্যন্তরীণ পয়েন্টারটি সামনে সরানো হয়নি। ডক্স
টিম

12
আর একটি বিষয় হ'ল যদি রেজেক্স খালি স্ট্রিংয়ের সাথে মেলে তবে এটি একটি অসীম লুপ হবে
ফ্যাবিওকোস্টা

139

str.match(pattern), যদি patternবিশ্বব্যাপী পতাকা থাকে তবে gসমস্ত ম্যাচকে অ্যারে হিসাবে ফিরিয়ে দেবে।

উদাহরণ স্বরূপ:

const str = 'All of us except @Emran, @Raju and @Noman was there';
console.log(
  str.match(/@\w*/g)
);
// Will log ["@Emran", "@Raju", "@Noman"]


15
সাবধান: মিলগুলি বস্তুর সাথে মেলে না, তবে ম্যাচের স্ট্রিংগুলি। উদাহরণস্বরূপ, গোষ্ঠীতে অ্যাক্সেস নেই "All of us except @Emran:emran26, @Raju:raju13 and @Noman:noman42".match(/@(\w+):(\w+)/g)(যা ফিরে আসবে ["@Emran:emran26", "@Raju:raju13", "@Noman:noman42"])
ম্যাডপ্রাগ

4
@ এমডপ্রোগ, ঠিক আছে, গ্রুপ মানগুলি যখন প্রয়োজনীয় হয় তখন এটি সবচেয়ে সহজ উপায় তবে উপযুক্ত নয়।
আনিস

1
এটি আমার পক্ষে কাজ করছে না। আমি কেবল প্রথম ম্যাচটি পাই।
অ্যান্থনি রবার্টস

7
@ অ্যান্থনি রবার্টস আপনাকে অবশ্যই "জি" পতাকা যুক্ত করতে হবে। /@\w/gবাnew RegExp("@\\w", "g")
অরুনা হেরাথ

88

সমস্ত ম্যাচ লুপ করতে, আপনি replaceফাংশনটি ব্যবহার করতে পারেন :

var re = /\s*([^[:]+):\"([^"]+)"/g;
var s = '[description:"aoeu" uuid:"123sth"]';

s.replace(re, function(match, g1, g2) { console.log(g1, g2); });

আমি মনে করি এটি খুব জটিল। তবে, একটি সহজ জিনিস করার বিভিন্ন উপায় সম্পর্কে জেনে ভাল লাগছে (আমি আপনার উত্তরটি আপ-ভোট দিয়েছি)।
আরশসফট

24
এটি পাল্টা কোড আপনি কোনও অর্থবোধক অর্থে কোনও কিছু "প্রতিস্থাপন" করছেন না। এটি কেবলমাত্র কোনও ভিন্ন উদ্দেশ্যে অন্য কোনও কার্যটি শোষণ করছে।
লুক মোরার

6
@ দেউদওয়াদ যদি ইঞ্জিনিয়াররা বাক্সের বাইরে চিন্তা না করে কেবল নিয়মগুলি মেনে চলতে থাকে তবে আমরা এখনই অন্যান্য গ্রহগুলিতে যাওয়ার কথা ভাবব না ;-)
ক্রিস্টোফ

1
@ দেউদওয়াদ দুঃখিত, আমি এখানে অলস অংশটি দেখতে ব্যর্থ হয়েছি। যদি ঠিক একই পদ্ধতিটিকে "প্রতিস্থাপন" না করে "প্রক্রিয়া" বলা হত তবে আপনি এটির সাথে ঠিক থাকবেন। আমি আশঙ্কা করছি আপনি কেবল পরিভাষায় আটকে গেছেন।
ক্রিস্টোফ

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

56

এটি একটি সমাধান

var s = '[description:"aoeu" uuid:"123sth"]';

var re = /\s*([^[:]+):\"([^"]+)"/g;
var m;
while (m = re.exec(s)) {
  console.log(m[1], m[2]);
}

এটি লনশিয়ার উত্তরের ভিত্তিতে, তবে সংক্ষিপ্ত।

লক্ষ করুন যে oc g 'পতাকাটি অবশ্যই অনুরোধগুলি জুড়ে অভ্যন্তরীণ পয়েন্টারটি এগিয়ে নিয়ে যেতে হবে।


17
str.match(/regex/g)

অ্যারে হিসাবে সমস্ত ম্যাচ ফেরত।

যদি কোনও রহস্যজনক কারণে আপনার অতিরিক্ত তথ্যের প্রয়োজন হয় exec, পূর্ববর্তী উত্তরের বিকল্প হিসাবে, আপনি নীচের মতো লুপের পরিবর্তে পুনরাবৃত্ত ফাংশন দিয়ে এটি করতে পারেন (এটি দেখতে শীতলও দেখায়)।

function findMatches(regex, str, matches = []) {
   const res = regex.exec(str)
   res && matches.push(res) && findMatches(regex, str, matches)
   return matches
}

// Usage
const matches = findMatches(/regex/g, str)

যেমন পূর্বে মন্তব্যে বলা হয়েছে, gপ্রতিটি এক্সিকিউশনে পয়েন্টারটিকে এগিয়ে নিয়ে যাওয়ার জন্য রেজেক্স সংজ্ঞা শেষে থাকা গুরুত্বপূর্ণ ।


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

11

অবশেষে আমরা একটি অন্তর্নির্মিত matchAllফাংশন দেখতে শুরু করছি, বিবরণ এবং সামঞ্জস্যের টেবিলের জন্য এখানে দেখুন । 2020 সালের মেয়ের মতো দেখে মনে হচ্ছে, ক্রোম, এজ, ফায়ারফক্স এবং নোড.জেএস (12+) সমর্থিত তবে আইই, সাফারি এবং অপেরা নয়। দেখে মনে হচ্ছে এটি ডিসেম্বর 2018খসড়া তৈরি হয়েছিল তাই এটি সমস্ত ব্রাউজারে পৌঁছানোর জন্য কিছুটা সময় দিন, তবে আমি বিশ্বাস করি এটি এটি সেখানে আসবে।

বিল্ট-ইন matchAllফাংশন চমৎকার কারণ এটি একটি ফেরৎ iterable । এটি প্রতিটি ম্যাচের জন্য ক্যাপচারকারী গ্রুপগুলিও ফেরত দেয়! সুতরাং আপনি যেমন জিনিস করতে পারেন

// get the letters before and after "o"
let matches = "stackoverflow".matchAll(/(\w)o(\w)/g);

for (match of matches) {
    console.log("letter before:" + match[1]);
    console.log("letter after:" + match[2]);
}

arrayOfAllMatches = [...matches]; // you can also turn the iterable into an array

প্রতিটি ম্যাচ অবজেক্টের মতো একই ফর্ম্যাটটি ব্যবহার করে বলেও মনে হয় match()। সুতরাং প্রতিটি বস্তু তিনটি অতিরিক্ত বৈশিষ্ট্য সহ মিল এবং ক্যাপচারিং গ্রুপগুলির একটি অ্যারে propertiesindex , inputএবং groups। সুতরাং দেখে মনে হচ্ছে:

[<match>, <group1>, <group2>, ..., index: <match offset>, input: <original string>, groups: <named capture groups>]

সম্পর্কে আরও তথ্যের matchAllজন্য একটি গুগল বিকাশকারী পৃষ্ঠাও রয়েছে । এছাড়াও রয়েছে polyfills / শিম্স পাওয়া যায়।


আমি সত্যিই এটি পছন্দ করি তবে এটি ফায়ারফক্স 66 66.০.৩ এ এখনও অবতীর্ণ হয়নি। Caniuse এখনও এটি সম্পর্কে একটি সমর্থন তালিকা নেই। আমি এইটার অপেক্ষায় আছি আমি এটি ক্রোমিয়ামে 74.0.3729.108 এ কাজ করে দেখছি।
লনি সেরা

1
@ লনিবেস্ট হ্যাঁ আপনি যে এমডিএন পৃষ্ঠার সাথে লিঙ্ক করেছেন তার সামঞ্জস্যতা বিভাগটি দেখতে পারেন । দেখে মনে হচ্ছে ফায়ারফক্স এটি 67 version সংস্করণে সমর্থন করা শুরু করেছে you're পলিফিল / শিমস উপলব্ধ রয়েছে, যা আমি আমার উত্তরে যুক্ত করেছি
woojoo666

10

আগুসের ফাংশনের উপর ভিত্তি করে, তবে আমি কেবল ম্যাচের মানগুলি ফেরত দিতে পছন্দ করি:

var bob = "&gt; bob &lt;";
function matchAll(str, regex) {
    var res = [];
    var m;
    if (regex.global) {
        while (m = regex.exec(str)) {
            res.push(m[1]);
        }
    } else {
        if (m = regex.exec(str)) {
            res.push(m[1]);
        }
    }
    return res;
}
var Amatch = matchAll(bob, /(&.*?;)/g);
console.log(Amatch);  // yeilds: [&gt;, &lt;]

8

Iteabless ভাল হয়:

const matches = (text, pattern) => ({
  [Symbol.iterator]: function * () {
    const clone = new RegExp(pattern.source, pattern.flags);
    let match = null;
    do {
      match = clone.exec(text);
      if (match) {
        yield match;
      }
    } while (match);
  }
});

একটি লুপ ব্যবহার:

for (const match of matches('abcdefabcdef', /ab/g)) {
  console.log(match);
}

অথবা আপনি যদি একটি অ্যারে চান:

[ ...matches('abcdefabcdef', /ab/g) ]

1
টাইপো: if (m)হওয়া উচিতif (match)
বটজে

অ্যারেগুলি ইতিমধ্যে পুনরাবৃত্তিযোগ্য, সুতরাং ম্যাচের অ্যারে ফেরা প্রত্যেকেও পুনরাবৃত্ত হবে। আর যদি আপনি কোন অ্যারের লগ কনসোল করেন তবে ব্রাউজারটি আসলে সামগ্রীগুলি মুদ্রণ করতে পারে। তবে জেনেরিক পুনরাবৃত্তীয় কনসোলটি লগইন করলেই আপনি [অবজেক্ট অবজেক্ট] gets ...}
স্টজহান

সমস্ত অ্যারে পুনরাবৃত্তিযোগ্য তবে সমস্ত পুনরাবৃত্তীয় অ্যারে নয়। একটি পুনরাবৃত্তযোগ্য উচ্চতর যদি আপনি জানেন না যে কলকারীকে কী করতে হবে। উদাহরণস্বরূপ, আপনি যদি কেবল প্রথম ম্যাচটি চান তবে একটি পুনরাবৃত্তযোগ্য আরও কার্যকর।
sdgfsdh

আপনার স্বপ্নটি বাস্তবে পরিণত হচ্ছে, ব্রাউজারগুলি একটি বিল্ট-matchAll
ইনটির

1
আমি এই উত্তরটি ম্যাচ-পরবর্তী সমস্ত বাস্তবায়ন পেরিয়ে এসেছি। আমি ব্রাউজার জেএস এর জন্য কিছু কোড লিখেছিলাম যা এটি সমর্থন করেছিল, কিন্তু নোড আসলে তা করেনি। এটি ম্যাচের জন্য একইরকম আচরণ করে সমস্ত কিছুই যাতে আমার কাছে পুনরায় লেখার জিনিসগুলি পড়তে হয় নি - চিয়ার্স!
ব্যবহারকারী 37309

8

আপনার যদি ES9 থাকে

(অর্থ যদি আপনার সিস্টেম: ক্রোম, নোড.জেএস, ফায়ারফক্স, ইত্যাদি ইকমাস্ক্রিপ্ট 2019 বা তার পরে সমর্থন করে) নতুনটি

ব্যবহার করুনyourString.matchAll( /your-regex/ )

আপনার যদি ES9 না থাকে

আপনার যদি কোনও পুরানো সিস্টেম থাকে তবে সহজ অনুলিপি এবং আটকানোর জন্য এখানে একটি ফাংশন রয়েছে

function findAll(regexPattern, sourceString) {
    let output = []
    let match
    // make sure the pattern has the global flag
    let regexPatternWithGlobal = RegExp(regexPattern,"g")
    while (match = regexPatternWithGlobal.exec(sourceString)) {
        // get rid of the string copy
        delete match.input
        // store the match data
        output.push(match)
    } 
    return output
}

উদাহরণস্বরূপ ব্যবহার:

console.log(   findAll(/blah/g,'blah1 blah2')   ) 

আউটপুট:

[ [ 'blah', index: 0 ], [ 'blah', index: 6 ] ]

5

ম্যাচগুলি পেতে আমার ফাংশনটি এখানে:

function getAllMatches(regex, text) {
    if (regex.constructor !== RegExp) {
        throw new Error('not RegExp');
    }

    var res = [];
    var match = null;

    if (regex.global) {
        while (match = regex.exec(text)) {
            res.push(match);
        }
    }
    else {
        if (match = regex.exec(text)) {
            res.push(match);
        }
    }

    return res;
}

// Example:

var regex = /abc|def|ghi/g;
var res = getAllMatches(regex, 'abcdefghi');

res.forEach(function (item) {
    console.log(item[0]);
});

আপনি বিশ্বব্যাপী পতাকা যুক্ত করতে ভুলে গেলে এই সমাধানটি অসীম লুপগুলি প্রতিরোধ করে।
ব্যবহারকারী 68311

2

ES9 সাল থেকে, ক্যাপচার গ্রুপগুলি এবং তাদের সূচকগুলির সাথে একত্রে সমস্ত ম্যাচ পাওয়ার আরও সহজ ও ভাল উপায়:

const string = 'Mice like to dice rice';
const regex = /.ice/gu;
for(const match of string.matchAll(regex)) {
    console.log(match);
}

// "

// ["ডাইস", সূচক: 13, ইনপুট: "ইঁদুর চাল পছন্দ করতে চাই", গোষ্ঠী: অপরিবর্তিত

// ["ভাত", সূচক: 18, ইনপুট: "ইঁদুর পছন্দ মতো চাল", গোষ্ঠী: অপরিবর্তিত]

এটি বর্তমানে ক্রোম, ফায়ারফক্স, অপেরাতে সমর্থিত। আপনি কখন এটি পড়ছেন তার উপর নির্ভর করে বর্তমান সমর্থনটি দেখতে এই লিঙ্কটি পরীক্ষা করুন


চমত্কার! তবে রেজেজের একটি পতাকা থাকা উচিত gএবং এটি শোনার lastIndexআগে এটি 0 এ পুনরায় সেট করা উচিত matchAll
এন কুদ্রিভতসেভ

1

এটা ব্যবহার কর...

var all_matches = your_string.match(re);
console.log(all_matches)

এটি সমস্ত ম্যাচগুলির একটি অ্যারে ফিরিয়ে দেবে ... এটি ঠিক কাজ করবে .... তবে মনে রাখবেন এটি গ্রুপগুলি বিবেচনায় নেবে না ... এটি কেবল পুরো ম্যাচগুলি ফিরিয়ে দেবে ...


0

আমি স্পষ্টভাবে স্ট্রিং.ম্যাচ () ফাংশনটি ব্যবহার করার এবং এটির জন্য একটি প্রাসঙ্গিক RegEx তৈরি করার পরামর্শ দেব। আমার উদাহরণটি স্ট্রিংগুলির তালিকার সাথে রয়েছে যা কীওয়ার্ড এবং বাক্যাংশগুলির জন্য ব্যবহারকারীদের ইনপুটগুলি স্ক্যান করার সময় প্রায়শই প্রয়োজনীয়।

    // 1) Define keywords
    var keywords = ['apple', 'orange', 'banana'];

    // 2) Create regex, pass "i" for case-insensitive and "g" for global search
    regex = new RegExp("(" + keywords.join('|') + ")", "ig");
    => /(apple|orange|banana)/gi

    // 3) Match it against any string to get all matches 
    "Test string for ORANGE's or apples were mentioned".match(regex);
    => ["ORANGE", "apple"]

আশাকরি এটা সাহায্য করবে!


0

এটি আপনার আরও জটিল সমস্যাটিতে সত্যই সহায়তা করবে না তবে আমি যাইহোক এটি পোস্ট করছি কারণ এটি আপনার মতো বিশ্বব্যাপী অনুসন্ধান না করে এমন লোকদের জন্য এটি একটি সহজ সমাধান।

পরিষ্কার হওয়ার উত্তরে আমি রেজেক্সকে সহজ করে দিয়েছি (এটি আপনার সঠিক সমস্যার সমাধান নয়)।

var re = /^(.+?):"(.+)"$/
var regExResult = re.exec('description:"aoeu"');
var purifiedResult = purify_regex(regExResult);

// We only want the group matches in the array
function purify_regex(reResult){

  // Removes the Regex specific values and clones the array to prevent mutation
  let purifiedArray = [...reResult];

  // Removes the full match value at position 0
  purifiedArray.shift();

  // Returns a pure array without mutating the original regex result
  return purifiedArray;
}

// purifiedResult= ["description", "aoeu"]

মন্তব্যগুলির চেয়ে এটি আরও ভার্বোজ দেখাচ্ছে, মন্তব্য ছাড়া এটি দেখতে এটির মতোই

var re = /^(.+?):"(.+)"$/
var regExResult = re.exec('description:"aoeu"');
var purifiedResult = purify_regex(regExResult);

function purify_regex(reResult){
  let purifiedArray = [...reResult];
  purifiedArray.shift();
  return purifiedArray;
}

নোট করুন যে কোনও গ্রুপ মিলছে না সেগুলি অ্যারেতে তালিকাভুক্ত করা হবে undefined মান ।

এই দ্রষ্টব্যটি রেগেক্স নির্দিষ্ট মানগুলির অ্যারে শুদ্ধ করতে ES6 স্প্রেড অপারেটর ব্যবহার করে। আপনি আইইএল সমর্থন চাইলে আপনার কোডটি বাবেলের মাধ্যমে চালানো দরকার ।


0

এখানে কিছুক্ষণ লুপ ছাড়াই একটি লাইন সমাধান

ক্রমটি ফলাফলের তালিকায় সংরক্ষিত আছে।

সম্ভাব্য ডাউনসাইডগুলি হ'ল

  1. এটি প্রতিটি ম্যাচের জন্য রেজেক্সকে ক্লোন করে।
  2. প্রত্যাশিত সমাধানের চেয়ে ফলাফলটি ভিন্ন রূপে। আপনার এগুলি আরও একবার প্রক্রিয়া করা প্রয়োজন।
let re = /\s*([^[:]+):\"([^"]+)"/g
let str = '[description:"aoeu" uuid:"123sth"]'

(str.match(re) || []).map(e => RegExp(re.source, re.flags).exec(e))

[ [ 'description:"aoeu"',
    'description',
    'aoeu',
    index: 0,
    input: 'description:"aoeu"',
    groups: undefined ],
  [ ' uuid:"123sth"',
    'uuid',
    '123sth',
    index: 0,
    input: ' uuid:"123sth"',
    groups: undefined ] ]

0

আমার ধারণা হ'ল যদি অতিরিক্ত বা অনুপস্থিত স্থানগুলির মতো প্রান্তের কেস থাকে তবে কম সীমানা সহ এই অভিব্যক্তিটিও একটি বিকল্প হতে পারে:

^\s*\[\s*([^\s\r\n:]+)\s*:\s*"([^"]*)"\s*([^\s\r\n:]+)\s*:\s*"([^"]*)"\s*\]\s*$

আপনি যদি এক্সপ্রেশনটি অন্বেষণ / সরলকরণ / পরিবর্তন করতে চান তবে এটি regex101.com এর ডানদিকে ডান প্যানেলে ব্যাখ্যা করা হয়েছে । আপনি যদি চান, আপনি এই লিঙ্কটিতেও দেখতে পারেন , কীভাবে এটি কিছু নমুনার ইনপুটগুলির সাথে মেলে।


পরীক্ষা

const regex = /^\s*\[\s*([^\s\r\n:]+)\s*:\s*"([^"]*)"\s*([^\s\r\n:]+)\s*:\s*"([^"]*)"\s*\]\s*$/gm;
const str = `[description:"aoeu" uuid:"123sth"]
[description : "aoeu" uuid: "123sth"]
[ description : "aoeu" uuid: "123sth" ]
 [ description : "aoeu"   uuid : "123sth" ]
 [ description : "aoeu"uuid  : "123sth" ] `;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

রেজেক্স সার্কিট

jex.im নিয়মিত এক্সপ্রেশন ভিজ্যুয়ালাইজ করে:

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


-5

আমার উত্তর এখানে:

var str = '[me nombre es] : My name is. [Yo puedo] is the right word'; 

var reg = /\[(.*?)\]/g;

var a = str.match(reg);

a = a.toString().replace(/[\[\]]/g, "").split(','));

3
আপনার ইনপুট স্ট্রিং ( str) এর ভুল ফর্ম্যাট রয়েছে (খুব বেশি শক্ত বন্ধনী)। আপনি কেবল কীটি ক্যাপচার করুন, মানটি নয়। আপনার কোডটিতে সিনট্যাক্স ত্রুটি রয়েছে এবং এটি সম্পাদন করে না (শেষ প্যারেন্টেসিস)। যদি আপনি ইতিমধ্যে স্বীকৃত উত্তর দিয়ে "পুরানো" প্রশ্নের উত্তর দেন, আপনি আরও জ্ঞান এবং আরও ভাল উত্তর যুক্ত করেছেন তা নিশ্চিত করুন তবে ইতিমধ্যে স্বীকৃত একটি। আমি মনে করি না যে আপনার উত্তরটি এটি করে।
সাফ করা হয়েছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.