জাভাস্ক্রিপ্ট রেজেক্সে ক্যাপচার গ্রুপগুলির নামকরণ?


208

আমি যতদূর জানি জাভাস্ক্রিপ্টে নামকৃত ক্যাপচারিং গ্রুপগুলির মতো কোনও জিনিস নেই। অনুরূপ কার্যকারিতা পাওয়ার বিকল্প উপায় কী?


1
জাভাস্ক্রিপ্টে ক্যাপচার গোষ্ঠী সংখ্যা অনুসারে হয় .. $ 1 প্রথম ক্যাপচার করা গোষ্ঠী, $ 2, $ 3 ... 99 ডলার পর্যন্ত তবে মনে হয় আপনি অন্য কিছু চান - যা বিদ্যমান নেই
এরিক

24
@ এরিক আপনি সংখ্যাযুক্ত ক্যাপচারিং গ্রুপগুলির বিষয়ে কথা বলছেন , ওপি নামকৃত ক্যাপচারিং গ্রুপগুলির বিষয়ে কথা বলছে । এগুলি বিদ্যমান, তবে আমরা জানতে চাই যে তাদের পক্ষে জেএসে সমর্থন রয়েছে কিনা।
আলবা মেন্ডিজ

4
একটা ব্যাপার জাভাস্ক্রিপ্ট মধ্যে নামে Regex আনতে প্রস্তাব , কিন্তু এটি বছর হতে পারে আগে আমরা দেখতে, যদি আমরা কি কখনো না।
ফ্রেগ্যান্ট

ফায়ারফক্স একটি ওয়েবসাইটে নামকরণ ক্যাপচার গ্রুপগুলি ব্যবহার করার চেষ্টা করার জন্য আমাকে শাস্তি দিয়েছে ... আমার নিজের ত্রুটি সত্যই। stackoverflow.com/a/58221254/782034
নিক গ্রেলে

উত্তর:


134

ECMAScript 2018 জাভাস্ক্রিপ্ট রেজিজেসগুলিতে নামকৃত ক্যাপচারিং গ্রুপগুলির সাথে পরিচয় করিয়েছে।

উদাহরণ:

  const auth = 'Bearer AUTHORIZATION_TOKEN'
  const { groups: { token } } = /Bearer (?<token>[^ $]*)/.exec(auth)
  console.log(token) // "Prints AUTHORIZATION_TOKEN"

আপনার যদি পুরানো ব্রাউজারগুলিকে সমর্থন করতে হয় তবে আপনি নামকৃত ক্যাপচারিং গ্রুপগুলির সাথে সাধারণ (সংখ্যাযুক্ত) ক্যাপচারিং গ্রুপগুলি দিয়ে সবকিছু করতে পারেন, আপনার কেবল সংখ্যার উপর নজর রাখা দরকার - যা আপনার গ্রুপে ক্যাপচার করার ক্রমটি জটিল হতে পারে রেজেক্স পরিবর্তন।

নামকৃত ক্যাপচারিং গ্রুপগুলির মধ্যে কেবলমাত্র দুটি "কাঠামোগত" সুবিধাগুলি আমি ভাবতে পারি:

  1. কিছু রেগেক্স স্বাদে (। নেট এবং জিজি সাফ্ট, যতদূর আমি জানি), আপনি আপনার রেজেেক্সে বিভিন্ন গোষ্ঠীগুলির জন্য একই নামটি ব্যবহার করতে পারেন ( এখানে উদাহরণস্বরূপ দেখুন যেখানে এটি গুরুত্বপূর্ণ )। তবে বেশিরভাগ রিজেেক্স স্বাদ যাইহোক এই কার্যকারিতা সমর্থন করে না।

  2. আপনার যদি সংখ্যার ক্যাপচারিং গোষ্ঠীগুলির এমন একটি পরিস্থিতিতে উল্লেখ করার প্রয়োজন হয় যেখানে তারা অঙ্কগুলি দ্বারা ঘিরে থাকে তবে আপনি সমস্যা পেতে পারেন। আসুন আপনি একটি অঙ্ক করার জন্য একটি শূন্য যোগ করতে চান এবং সেইজন্য প্রতিস্থাপন করতে চান বলে (\d)সঙ্গে $10। জাভাস্ক্রিপ্টে, এটি কাজ করবে (যতক্ষণ না আপনার রেজিজেটে 10 টিরও কম ক্যাপচারিং গ্রুপ থাকবে) তবে পার্ল ভাবেন আপনি সংখ্যার 10পরিবর্তে ব্যাকেরেফারেন্স নম্বরটি খুঁজছেন 1, এর পরে একটি 0। পার্লে, আপনি ${1}0এই ক্ষেত্রে ব্যবহার করতে পারেন ।

এগুলি ছাড়াও, নামকৃত ক্যাপচারিং গ্রুপগুলি কেবলমাত্র "সিনট্যাকটিক চিনি"। এটি কেবল যখন আপনার সত্যিকারের প্রয়োজন তখন ক্যাপচারিং গ্রুপগুলি ব্যবহার করতে এবং (?:...)অন্য সমস্ত পরিস্থিতিতে নন-ক্যাপচারিং গ্রুপগুলি ব্যবহার করতে সহায়তা করে ।

জাভাস্ক্রিপ্টের সাথে সবচেয়ে বড় সমস্যা (আমার মতে) হ'ল এটি ভার্বোজ রেজিক্সগুলিকে সমর্থন করে না যা পাঠযোগ্য, জটিল নিয়মিত অভিব্যক্তি তৈরি করা অনেক সহজ করে তোলে।

স্টিভ লেভিথনের এক্সরেগএক্সপ্রেস লাইব্রেরি এই সমস্যাগুলি সমাধান করে।


5
অনেক স্বাদ একই ক্যাপচারিং গ্রুপের নামটিকে একাধিক বার রিজেজেসে ব্যবহার করার অনুমতি দেয়। তবে কেবলমাত্র নেট এবং পার্ল ৫.১০++ ম্যাচে অংশ নেওয়া কোনও নামের শেষ গ্রুপের দ্বারা কৃত মানকে রেখে বিশেষত এটি কার্যকর করে তোলে।
slevithan

103
বিশাল সুবিধাটি হ'ল: আপনি কেবল নিজের RegExp পরিবর্তন করতে পারবেন, কোনও সংখ্যা-থেকে-পরিবর্তনশীল ম্যাপিং। নন-ক্যাপচারিং গ্রুপগুলি একটি ক্ষেত্রে বাদে এই সমস্যাটি সমাধান করে: গ্রুপগুলির ক্রম পরিবর্তন হলে কী হবে? এছাড়াও, এই অতিরিক্ত চরিত্রগুলি অন্য গ্রুপগুলিতে রাখার জন্য এটি বিরক্তিকর ...
আলবা মেন্ডেজ

55
তথাকথিত সিনট্যাকটিক চিনি কোড রিডিবিলিটি মিষ্টি করতে সহায়তা করে !
মিচিফ

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

4
অক্টোবর 2019 পর্যন্ত, ফায়ারফক্স, আইই 11 এবং মাইক্রোসফ্ট এজ (প্রাক ক্রোমিয়াম) নামযুক্ত গ্রুপ ক্যাপচারগুলি সমর্থন করে না। বেশিরভাগ অন্যান্য ব্রাউজার (এমনকি অপেরা এবং স্যামসুং মোবাইল) করেন। caniuse.com/…
এখনও মনিকার 18

63

আপনি এক্সরেগএক্সপ ব্যবহার করতে পারেন, অতিরিক্ত সংশ্লেষ , পতাকা এবং পদ্ধতিগুলির সমর্থন সহ নিয়মিত এক্সপ্রেশনগুলির ক্রম-ব্রাউজারের একটি বাড়ানো, এক্সটেনসিবল কার্যকরকরণ :

  • নামকরণ ক্যাপচারের জন্য বিস্তৃত সমর্থন সহ নতুন রেইজেক্স এবং প্রতিস্থাপন পাঠ্য সিনট্যাক্স যুক্ত করে ।
  • দুটি নতুন রেইগেক্স পতাকা যুক্ত করে s:, সমস্ত অক্ষর (ওরফে ডটল বা সিঙ্গললাইন মোড) এর সাথে ডট ম্যাচ তৈরি করতে এবং xফ্রি-স্পেসিং এবং মন্তব্যের জন্য (ওরফে এক্সটেন্ডেড মোড)।
  • ফাংশন এবং পদ্ধতিগুলির একটি স্যুট সরবরাহ করে যা জটিল রেইজেক্সকে বাতাস প্রক্রিয়াকরণ করে তোলে make
  • রেজেক্স আচরণ এবং সিনট্যাক্সে সর্বাধিক সম্মুখীন ক্রস ব্রাউজারের অসঙ্গতিগুলি স্বয়ংক্রিয়ভাবে সমাধান করে।
  • XRegExp এর নিয়মিত প্রকাশের ভাষাতে নতুন সিনট্যাক্স এবং পতাকা যুক্ত করে এমন প্লাগইনগুলি আপনাকে সহজেই তৈরি এবং ব্যবহার করতে দেয়।

60

আর একটি সম্ভাব্য সমাধান: গ্রুপের নাম এবং সূচকগুলি যুক্ত একটি বিষয় তৈরি করুন।

var regex = new RegExp("(.*) (.*)");
var regexGroups = { FirstName: 1, LastName: 2 };

তারপরে, গ্রুপগুলি উল্লেখ করতে অবজেক্ট কীগুলি ব্যবহার করুন:

var m = regex.exec("John Smith");
var f = m[regexGroups.FirstName];

এটি রেগেক্সের ফলাফলগুলি ব্যবহার করে কোডের পঠনযোগ্যতা / গুণমানকে উন্নত করে, তবে নিজেই রেগেক্সের পঠনযোগ্যতা নয়।


58

ES6 এ আপনি আপনার গ্রুপগুলি ধরার জন্য অ্যারের কাঠামোগত ব্যবহার করতে পারেন:

let text = '27 months';
let regex = /(\d+)\s*(days?|months?|years?)/;
let [, count, unit] = regex.exec(text) || [];

// count === '27'
// unit === 'months'

বিজ্ঞপ্তি:

  • শেষের প্রথম কমাটি letফলাফলের অ্যারের প্রথম মানটি এড়িয়ে যায় যা পুরো ম্যাচিং স্ট্রিং
  • || []পরে .exec()যখন সেখানে কোনো মিল নেই (কারণ একটি ডেসট্রাকচারিং ত্রুটি প্রতিরোধ করবে .exec()ফিরে আসবে null)

1
প্রথম কমা হ'ল কারণ অ্যারের প্রথম উপাদানটি ম্যাচ দিয়ে ফিরে এসেছে ইনপুট এক্সপ্রেশন, তাই না?
এমিলিও গ্রিসোলিয়া

1
String.prototype.matchএর সাথে একটি অ্যারে প্রদান করে: 0 পজিশনে পুরো ম্যাচিং স্ট্রিং, তার পরে কোনও গ্রুপ groups প্রথম কমাটি বলে যে "উপাদানটি 0 অবস্থানে এড়িয়ে যাও"
ফ্রেঙ্গান্ট

2
প্রতিস্থাপনকারী বা ES6 + টার্গেটযুক্ত তাদের জন্য এখানে আমার প্রিয় উত্তর। এটি অগত্যা অসঙ্গতি ত্রুটিগুলি যেমন নামকৃত সূচকগুলি প্রতিরোধ করতে পারে না যদি উদাহরণস্বরূপ একটি পুনরায় ব্যবহৃত রেজেক্স পরিবর্তন হয় তবে আমি মনে করি যে এখানে সংক্ষিপ্ততাটি সহজেই এটির জন্য প্রস্তুত হয়। আমি নির্বাচন করেছেন RegExp.prototype.execওভার String.prototype.matchজায়গায় যেখানে স্ট্রিং থাকতে পারে এমন nullঅথবা undefined
মাইক হিল

22

আপডেট: এটি অবশেষে এটি জাভাস্ক্রিপ্ট (ECMAScript 2018) এ তৈরি করেছে!


নামযুক্ত ক্যাপচারিং গ্রুপগুলি খুব শীঘ্রই এটি জাভাস্ক্রিপ্টে তৈরি করতে পারে।
এর প্রস্তাব ইতিমধ্যে 3 পর্যায়ে রয়েছে at

কোনও ক্যাপচার গ্রুপকে (?<name>...)কোনও সনাক্তকারী নামের জন্য সিনট্যাক্স ব্যবহার করে কৌণিক বন্ধনীগুলির ভিতরে একটি নাম দেওয়া যেতে পারে । কোনও তারিখের জন্য নিয়মিত অভিব্যক্তিটি তখন লেখা যেতে পারে /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u। প্রতিটি নাম অনন্য হতে হবে এবং ECMAScript আইডেন্টিফায়ারনেমের জন্য ব্যাকরণ অনুসরণ করা উচিত ।

নিয়মিত প্রকাশের ফলাফলের নাম গোষ্ঠীগুলির গোষ্ঠীগুলির সম্পত্তি থেকে অ্যাক্সেস করা যায়। গ্রুপগুলির তালিকাভুক্ত রেফারেন্সগুলিও তৈরি করা হয়েছে, যেমনটি নামবিহীন গোষ্ঠীগুলির জন্য। উদাহরণ স্বরূপ:

let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
let result = re.exec('2015-01-02');
// result.groups.year === '2015';
// result.groups.month === '01';
// result.groups.day === '02';

// result[0] === '2015-01-02';
// result[1] === '2015';
// result[2] === '01';
// result[3] === '02';

এটি এই মুহূর্তে একটি পর্যায় 4 প্রস্তাব।
0

আপনি যদি '18 ব্যবহার করছেন, তবে পাশাপাশি ধ্বংসাত্মক কাজগুলি করতে পারেন; let {year, month, day} = ((result) => ((result) ? result.groups : {}))(re.exec('2015-01-02'));
হ্যাশব্রাউন

6

ক্যাপচার করা গোষ্ঠীগুলির নামকরণ একটি জিনিস সরবরাহ করে: জটিল নিয়মিত প্রকাশের সাথে কম বিভ্রান্তি।

এটি আপনার ব্যবহারের ক্ষেত্রে সত্যই নির্ভর করে তবে আপনার রেগেক্সকে সুন্দরভাবে মুদ্রণ করতে সহায়তা করতে পারে।

অথবা আপনি চেষ্টা করেছেন এবং আপনার বন্দী গোষ্ঠীগুলিকে উল্লেখ করার জন্য ধ্রুবকগুলি সংজ্ঞায়িত করতে পারেন।

এরপরে মন্তব্যগুলি আপনার কোডটি পড়ে অন্যদের দেখাতে সহায়তা করতে পারে, আপনি কী করেছেন।

বাকি জন্য আমি টিমস উত্তর সাথে একমত হতে হবে।


5

একটি নোড.জেএস লাইব্রেরি রয়েছে যার নাম-রেজিপ্সপ বলা হয় যা আপনি আপনার নোড.জেএস প্রকল্পগুলিতে ব্যবহার করতে পারেন (ব্রাউজারে ব্রাউজারিফাই বা অন্যান্য প্যাকেজিং স্ক্রিপ্ট সহ লাইব্রেরিটি প্যাকেজিং করে)। তবে গ্রন্থাগারটি নিয়মিত অভিব্যক্তিগুলির সাথে ব্যবহার করা যাবে না যেখানে নামবিহীন ক্যাপচারিং গ্রুপ রয়েছে।

আপনি যদি আপনার নিয়মিত অভিব্যক্তিতে খোলার ক্যাপচারিং বন্ধনীগুলি গণনা করেন তবে আপনি নামকৃত ক্যাপচারিং গোষ্ঠী এবং আপনার রেজেক্সে নম্বরযুক্ত ক্যাপচারিং গোষ্ঠীর মধ্যে একটি ম্যাপিং তৈরি করতে পারেন এবং অবাধে মিশ্রিত এবং মিলতে পারেন। রেজেেক্স ব্যবহারের আগে আপনাকে কেবল গ্রুপের নামগুলি সরিয়ে ফেলতে হবে। আমি তিনটি ফাংশন লিখেছি যে এটি প্রদর্শন করে। এই सारটি দেখুন: https://gist.github.com/gbirke/2cc2370135b665eee3ef


এটি অবাক করা হালকা ওজনের, আমি এটি ব্যবহার করে দেখি
fregante

এটি জটিল নিয়মিত অভিব্যক্তিতে নিয়মিত গোষ্ঠীর ভিতরে নেস্টেড নামক গোষ্ঠীর সাথে কাজ করে?
এলসাজকো

এটা নিখুঁত নয়। বাগ যখন: getMap ("((a | b (: <foo> c)))"); foo তৃতীয় গ্রুপ হওয়া উচিত, দ্বিতীয় নয়। /((a|b(c)))/g.exec("bc "); ["বিসি", "বিসি", "বিসি", "সি"]
এলসাজকো

3

টিম পিটজ্যাকার যেমন বলেছিলেন ইসিএমএসক্রিপ্ট 2018 নামক ক্যাপচারিং গোষ্ঠীগুলিকে জাভাস্ক্রিপ্ট রেজেক্সসে পরিচয় করিয়ে দিয়েছে। তবে উপরের উত্তরগুলিতে আমি যা পাইনি তা হ'ল কীভাবে রেজিজেসে নামযুক্ত বন্দী গোষ্ঠীটি ব্যবহার করা যায়।

আপনি এই সিনট্যাক্স নামে দখল গ্রুপ ব্যবহার করতে পারেন: \k<name>। উদাহরণ স্বরূপ

var regexObj = /(?<year>\d{4})-(?<day>\d{2})-(?<month>\d{2}) year is \k<year>/

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

let result = regexObj.exec('2019-28-06 year is 2019');
// result.groups.year === '2019';
// result.groups.month === '06';
// result.groups.day === '28';

  var regexObj = /(?<year>\d{4})-(?<day>\d{2})-(?<month>\d{2}) year is \k<year>/mgi;

function check(){
    var inp = document.getElementById("tinput").value;
    let result = regexObj.exec(inp);
    document.getElementById("year").innerHTML = result.groups.year;
    document.getElementById("month").innerHTML = result.groups.month;
    document.getElementById("day").innerHTML = result.groups.day;
}
td, th{
  border: solid 2px #ccc;
}
<input id="tinput" type="text" value="2019-28-06 year is 2019"/>
<br/>
<br/>
<span>Pattern: "(?<year>\d{4})-(?<day>\d{2})-(?<month>\d{2}) year is \k<year>";
<br/>
<br/>
<button onclick="check()">Check!</button>
<br/>
<br/>
<table>
  <thead>
    <tr>
      <th>
        <span>Year</span>
      </th>
      <th>
        <span>Month</span>
      </th>
      <th>
        <span>Day</span>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>
        <span id="year"></span>
      </td>
      <td>
        <span id="month"></span>
      </td>
      <td>
        <span id="day"></span>
      </td>
    </tr>
  </tbody>
</table>


2

আপনি ভ্যানিলা জাভাস্ক্রিপ্ট দিয়ে এটি করতে পারবেন না, তবে আপনি কিছু জাদু ব্যবহার করে সূচিযুক্ত ম্যাচগুলিকে নামকরণে রূপান্তর করতে Array.prototypeপছন্দ মতো কিছু ফাংশন ব্যবহার করতে পারেন ।Array.prototype.reduce

স্পষ্টতই, নিম্নলিখিত সমাধানের প্রয়োজন মেলে যাতে ক্রম ঘটে:

// @text Contains the text to match
// @regex A regular expression object (f.e. /.+/)
// @matchNames An array of literal strings where each item
//             is the name of each group
function namedRegexMatch(text, regex, matchNames) {
  var matches = regex.exec(text);

  return matches.reduce(function(result, match, index) {
    if (index > 0)
      // This substraction is required because we count 
      // match indexes from 1, because 0 is the entire matched string
      result[matchNames[index - 1]] = match;

    return result;
  }, {});
}

var myString = "Hello Alex, I am John";

var namedMatches = namedRegexMatch(
  myString,
  /Hello ([a-z]+), I am ([a-z]+)/i, 
  ["firstPersonName", "secondPersonName"]
);

alert(JSON.stringify(namedMatches));


যে বেশ শান্ত. আমি কেবল ভাবছি .. একটি কাস্টম রেজেক্স গ্রহণ করে এমন একটি রেইগেক্স ফাংশন তৈরি করা কি সম্ভব হবে না? যাতে আপনি যেতে পারেনvar assocArray = Regex("hello alex, I am dennis", "hello ({hisName}.+), I am ({yourName}.+)");
ফোরিভিন

@ ফোরিভিন স্পষ্টতই আপনি আরও যেতে পারেন এবং এই বৈশিষ্ট্যটি বিকাশ করতে পারেন। এটি কাজ করা কঠিন হবে না: ডি
ম্যাটাস ফিডেমরাইজার

আপনি RegExpতার প্রোটোটাইপে কোনও ফাংশন যুক্ত করে অবজেক্টটি প্রসারিত করতে পারেন ।
মিঃ টিএ

@ মিঃ টিএ এএফাইক, এটি বিল্ট-ইন অবজেক্টগুলি বাড়ানোর প্রস্তাব দেওয়া হয়নি
ম্যাটাস ফিডেম্রেজার

0

ECMAScript 2018 নেই?

আমার লক্ষ্য ছিল নামকরণ করা গোষ্ঠীগুলির সাথে আমরা যা ব্যবহার করি তার সাথে এটি যথাসম্ভব অনুরূপভাবে কাজ করা। যদিও ECMAScript 2018 এ আপনি ?<groupname>একটি নামী গোষ্ঠীটি নির্দেশ করতে (?!=<groupname>)গোষ্ঠীর ভিতরে রাখতে পারেন, পুরানো জাভাস্ক্রিপ্টের জন্য আমার সমাধানে, আপনি একই জিনিসটি করতে দলের ভিতরে রাখতে পারেন । সুতরাং এটি বন্ধুত্বের একটি অতিরিক্ত সেট এবং একটি অতিরিক্ত !=। চমত্কার বন্ধ!

আমি এগুলির সমস্ত একটি স্ট্রিং প্রোটোটাইপ ফাংশনে আবৃত করেছি

বৈশিষ্ট্য

  • পুরানো জাভাস্ক্রিপ্ট সঙ্গে কাজ করে
  • কোন অতিরিক্ত কোড
  • ব্যবহার করা বেশ সহজ
  • রেজেক্স এখনও কাজ করে
  • গোষ্ঠীগুলি রেজেক্সের মধ্যেই নথিভুক্ত হয়
  • গ্রুপের নামগুলিতে স্পেস থাকতে পারে
  • ফলাফল সঙ্গে বস্তু ফেরত

নির্দেশনা

  • জায়গা (?!={groupname})প্রতিটি গ্রুপ আপনি যেটির নাম দিতে চান ভিতরে
  • কোনো অ-ক্যাপচার গ্রুপ নিষ্কাশন মনে রাখবেন ()রেখে ?:গোষ্ঠীর শুরুতে। এগুলির নাম দেওয়া হবে না।

arrays.js

// @@pattern - includes injections of (?!={groupname}) for each group
// @@returns - an object with a property for each group having the group's match as the value 
String.prototype.matchWithGroups = function (pattern) {
  var matches = this.match(pattern);
  return pattern
  // get the pattern as a string
  .toString()
  // suss out the groups
  .match(/<(.+?)>/g)
  // remove the braces
  .map(function(group) {
    return group.match(/<(.+)>/)[1];
  })
  // create an object with a property for each group having the group's match as the value 
  .reduce(function(acc, curr, index, arr) {
    acc[curr] = matches[index + 1];
    return acc;
  }, {});
};    

ব্যবহার

function testRegGroups() {
  var s = '123 Main St';
  var pattern = /((?!=<house number>)\d+)\s((?!=<street name>)\w+)\s((?!=<street type>)\w+)/;
  var o = s.matchWithGroups(pattern); // {'house number':"123", 'street name':"Main", 'street type':"St"}
  var j = JSON.stringify(o);
  var housenum = o['house number']; // 123
}

ও এর ফলাফল

{
  "house number": "123",
  "street name": "Main",
  "street type": "St"
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.