জাভাস্ক্রিপ্টে প্রথম বন্ধনীগুলির মধ্যে একটি স্ট্রিং পেতে নিয়মিত প্রকাশ


177

আমি একটি নিয়মিত এক্সপ্রেশন লিখতে চেষ্টা করছি যা প্রথম বন্ধনীগুলির মধ্যে একটি স্ট্রিং দেয়। উদাহরণস্বরূপ: আমি স্ট্রিংটি পেতে চাই যা "(" এবং ")" স্ট্রিংয়ের মধ্যে থাকে

I expect five hundred dollars ($500).

ফিরে আসবে

$500

পাওয়া রেগুলার এক্সপ্রেশন জাভাস্ক্রিপ্ট দুটি স্ট্রিং মধ্যে একটি স্ট্রিং পেতে

তবে আমি রেইগেক্সের সাথে নতুন। আমি জানি না কীভাবে '(', ')' regexp এ ব্যবহার করতে হয়



আপনি নীচে গো-ওলেগের সমাধানটি ব্যবহার করতে পারেন, ডলারের চিহ্নের জন্য পরীক্ষা করতে কিছুটা সংশোধন করেছেন:var regExp = /\(\$([^)]+)\)/;
ডোম ডে

উত্তর:


460

আপনাকে পালানো (একটি \) প্রথম বন্ধনী (যা প্রথম বন্ধনীর সাথে মেলে) এবং আপনার ক্যাপচারিং গ্রুপ তৈরি করে এমন একটি নিয়মিত প্যারেনেসিসের একটি গ্রুপ তৈরি করতে হবে:

var regExp = /\(([^)]+)\)/;
var matches = regExp.exec("I expect five hundred dollars ($500).");

//matches[1] contains the value between the parentheses
console.log(matches[1]);

ভাঙ্গন:

  • \( : একটি খোলার প্রথম বন্ধনীর সাথে মেলে
  • ( : গ্রুপ ক্যাপচার শুরু
  • [^)]+: এক বা একাধিক নন ) চরিত্রের সাথে
  • ) : গ্রুপ ক্যাপচারিং শেষ
  • \) : বন্ধ বন্ধনীর সাথে ম্যাচ করুন

এখানে RegExplained উপর একটি চাক্ষুষ ব্যাখ্যা


12
+1 ভাল লাগল, কবজির মতো কাজ করেছে। আমি আপনাকে চাক্ষুষ ব্যাখ্যার জন্য এই tinyurl.com/mog7lr3 যুক্ত করতে চাই add
প্রবীণ

5
@ ব্যবহারকারী1671639: আপডেট হয়েছে। লিঙ্কের জন্য ধন্যবাদ!
go-oleg

5
আপনি ক্যাপচার করতে চান এমন প্রথম বন্ধনীগুলির মধ্যে থাকলে এটি কাজ করে না। যেমন: "আমি পাঁচশো ডলার আশা করি (500 ডলার (তবে আমি জানি যে আমি আর এই টাকাটি আর দেখব না))"।
জেবি

1
এই রেজেক্স কেবল স্টিং প্রতি এক উদাহরণের সাথে মিলে কাজ করে। /gপ্রত্যাশার মতো বিশ্ব পতাকা ব্যবহার করবে না work
সিল্কএডমিন

2
নীচের মত বন্ধনীগুলির মধ্যে যদি আপনার একাধিক স্ট্রিং থাকে তবে এর সমাধান কী: "আমি প্রত্যাশা করি (পাঁচ) শত ডলার ($ 500)" আসুন আমি বলি যে আমি সেই বিশেষ স্ট্রিংগুলির একটি অ্যারে চাই।
মোহামাদ আল আসমার

33

স্ট্রিং ম্যানিপুলেশন চেষ্টা করুন:

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var newTxt = txt.split('(');
for (var i = 1; i < newTxt.length; i++) {
    console.log(newTxt[i].split(')')[0]);
}

বা রেজেক্স ( যা উপরের তুলনায় কিছুটা ধীরে ধীরে )

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var regExp = /\(([^)]+)\)/g;
var matches = txt.match(regExp);
for (var i = 0; i < matches.length; i++) {
    var str = matches[i];
    console.log(str.substring(1, str.length - 1));
}

7
ক্রোম j৯.০.৩০১০ এ আজ সেই জেএসপিফার চালানো, রেজেক্সটি 8% দ্বারা দ্রুত ছিল
অ্যালেক্স ম্যাকমিলান

9

অস্থায়ী গ্লোবাল ভেরিয়েবলগুলির ব্যবহার এড়াতে কার্যকরী প্রোগ্রামিং শৈলীতে মিঃগ্রিনের উত্তর পোর্ট করা হয়েছে ।

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })

আমি যা খুঁজছিলাম stackoverflow.com/questions/49614116/...
wobsoriano

8

সহজ সমাধান

বিজ্ঞপ্তি : এই সমাধানটি এই প্রশ্নের মধ্যে কেবল একক "(" এবং ")" স্ট্রিংয়ের মতো স্ট্রিংগুলির জন্য ব্যবহার করা যেতে পারে।

("I expect five hundred dollars ($500).").match(/\((.*)\)/).pop();

অনলাইন ডেমো (jsfiddle)


5

একটি মুদ্রার সাইন এর পরে কেবল অঙ্কের জন্য: \(.+\s*\d+\s*\)কাজ করা উচিত

বা \(.+\)বন্ধনী ভিতরে কিছু জন্য


2
এটি নমুনা পাঠ্যের জন্য কাজ করবে, তবে এর )পরে I expect five hundred dollars ($500). (but I'm going to pay).লোভের মতো স্ট্রিংয়ের পরে যদি আরও কিছু প্রদর্শিত হয় তবে +আরও অনেক কিছু ধরা পড়বে।
রো ইয়ো মি

@ ডেনোমেলস সুতরাং আপনি কীভাবে এই স্ট্রিংগুলির উভয় উদাহরণ ক্যাপচার করতে পারেন। আদর্শভাবে আমি অনুরূপ কিছু করছি তবে আমি তা করতে চাই: ($500)এবং (but I'm going to pay) মিলিত হওয়া তবে দুটি একক ম্যাচের আইটেম হিসাবে বিবেচনা না করে দুটি পৃথক ম্যাচে? আগাম ধন্যবাদ!
টম বার্ড

(। +) আমার প্রয়োজনীয়তার জন্য কাজ করেছে। "ডানহিল (বোতল / প্যাকেট / পট / শট)" এর মতো
স্টাফ ক্যাপচার

5

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

\(([^()]*)\)

প্যাটার্ন। দেখুন Regex ডেমো

জাভাস্ক্রিপ্টে এটি পছন্দ করুন

var rx = /\(([^()]*)\)/g;

প্যাটার্ন বিশদ

পুরো ম্যাচটি পেতে, গ্রুপ 0 মানটি ধরুন, যদি আপনার প্রথম বন্ধনীতে পাঠ্যের প্রয়োজন হয় তবে গ্রুপ 1 মানটি ধরুন।

সর্বাধিক আপ টু ডেট জাভাস্ক্রিপ্ট কোড ডেমো (ব্যবহার করে matchAll):

const strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
const rx = /\(([^()]*)\)/g;
strs.forEach(x => {
  const matches = [...x.matchAll(rx)];
  console.log( Array.from(matches, m => m[0]) ); // All full match values
  console.log( Array.from(matches, m => m[1]) ); // All Group 1 values
});

লিগ্যাসি জাভাস্ক্রিপ্ট কোড ডেমো (ইএস 5 অনুবর্তী):


এই Regex মহান কারণ এটি শুধুমাত্র জোড়া ধারন হয় ()এবং তাদের বিষয়বস্তু, এমনকি যখন পাশাপাশি ()()
সীমারবিহীন

1
@limitlessloop যেহেতু এটি একটি সহায়ক উত্তর বলে মনে হচ্ছে, তাই আমি একটি নতুন matchAllভিত্তিক জাভাস্ক্রিপ্ট কোড ডেমো যুক্ত করেছি।
উইক্টর স্ট্রিবিউ


2

বিকল্প:

var str = "I expect five hundred dollars ($500) ($1).";
str.match(/\(.*?\)/g).map(x => x.replace(/[()]/g, ""));
 (2) ["$500", "$1"]

আপনার প্রয়োজন হলে বর্গক্ষেত্র বা কোঁকড়ানো বন্ধনীগুলির সাথে বন্ধনীগুলি প্রতিস্থাপন করা সম্ভব


1
var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/;
alert(rex.exec(str));

Number এবং তারপরে ')' দিয়ে শুরু হওয়া প্রথম সংখ্যার সাথে মিলবে। ')' ম্যাচের অংশ হবে না। প্রথম ম্যাচের সাথে কোডটি সতর্ক করে।

var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/g;
var matches = str.match(rex);
for (var i = 0; i < matches.length; i++)
{
    alert(matches[i]);
}

সমস্ত কোডের সাথে এই কোডটি সতর্ক করে।

তথ্যসূত্র:

"? = এন" http://www.w3schools.com/jsref/jsref_obj_regexp.asp জন্য অনুসন্ধান করুন

"x (? = y)" অনুসন্ধান করুন https://developer.mozilla.org/en/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / রেগএক্সপ

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