নিয়মিত প্রকাশকে কীভাবে লোভী করে তুলবেন?


226

আমি jQuery ব্যবহার করছি। বিশেষ অক্ষরের একটি ব্লক (শুরু এবং শেষ) সহ আমার একটি স্ট্রিং রয়েছে। আমি সেই বিশেষ অক্ষরগুলির ব্লক থেকে পাঠ্যটি পেতে চাই। ইন-স্ট্রিং সন্ধানের জন্য আমি একটি নিয়মিত অভিব্যক্তি অবজেক্টটি ব্যবহার করেছি। তবে দু'টি বিশেষ চরিত্র বা তার বেশি থাকাকালীন আমি কীভাবে jQuery কে একাধিক ফলাফল খুঁজতে বলব?

আমার এইচটিএমএল:

<div id="container">
    <div id="textcontainer">
     Cuc chiến pháp lý gia [|cơ thử|nghim|] th trường [|test2|đây là test ln 2|] chng khoán [|Mỹ|day la nuoc my|] và ngân hàng đầu tư quyn lc nht Ph Wall mi ch bt đầu.
    </div>
</div>

এবং আমার জাভাস্ক্রিপ্ট কোড:

$(document).ready(function() {
  var takedata = $("#textcontainer").text();
  var test = 'abcd adddb';
  var filterdata = takedata.match(/(\[.+\])/);

  alert(filterdata); 

  //end write js 
});

আমার ফলাফলটি হল: [| cơ thử | nghiệm |] thị trường [| test2 | ày lầ test lần 2 |] chogng khán [| Mỹ | day la nuoc my |] । তবে এটি আমি চাই ফলাফল নয় :(। 1 বারের জন্য [পাঠ্য] এবং 2 বারের জন্য [ডেমো] কীভাবে পাবেন?


আমি ইন্টারনেটে তথ্য অনুসন্ধানের পরে সবেমাত্র আমার কাজটি করেছি ^^ আমি এই জাতীয় কোড তৈরি করি:

var filterdata = takedata.match(/(\[.*?\])/g);
  • আমার রেজাল্ট হল: [| cơ বৃহস্পতি | nghiệm |], [| test2 | | đây থেকে 2 lần থেকে পরীক্ষা là থেকে |] এই অধিকার !. তবে আমি আসলে এটি বুঝতে পারি না। আপনি আমার উত্তর দিতে পারেন কেন?

উত্তর:


491

অ-লোভী রেজেক্স সংশোধকগুলি তাদের লোভী পাল্টা অংশগুলির মতো তবে ?তাৎক্ষণিকভাবে তাদের অনুসরণ করার সাথে:

*  - zero or more
*? - zero or more (non-greedy)
+  - one or more
+? - one or more (non-greedy)
?  - zero or one
?? - zero or one (non-greedy)

29
?এটি তার নিজস্ব অর্থ 'এক বা শূন্য' (তবে লোভী!) হিসাবে লক্ষ করা দরকারী হতে পারে । যেমন 'bb'.replace(/b?/, 'a') //'ab'এবং'bb'.replace(/c?/, 'a') //'abb'
Hashbrown

1
সি সেখানে কী
মুহাম্মদ উমার

1
@ মুহম্মদ উমর আমার মনে হয় তিনি প্রস্তাব দিচ্ছিলেন কারণ এটি cমিলবে না, তবে আপনার সাথে এটি আছে ?যা 0 or 1মিলবে 0 number of c charactersতাই এটি প্রতিস্থাপন করে। এটি কীভাবে কাজ করে সে সম্পর্কে আমার কোনও ধারণা নেই, কারণ এটি আমি চেষ্টা করেছি এমন কোনও রেইগেক্স ইঞ্জিন সংকলন করে না 😢
নোকটিস

35

আপনি ঠিক বলেছেন যে লোভ একটি সমস্যা:

--A--Z--A--Z--
  ^^^^^^^^^^
     A.*Z

আপনি যদি উভয়ের সাথে মিল রাখতে চান তবে আপনাকে A--Zব্যবহার করতে হবে A.*?Z( "অনিচ্ছুক" বা আলস্য করে ?তোলে *)।

এটি করার আরও কখনও কখনও আরও ভাল উপায় আছে, যদিও, যেমন

A[^Z]*+Z

এটি ব্যাকট্র্যাকিং হ্রাস করতে অবহেলিত চরিত্রের শ্রেণি এবং অধিক পরিমাণের পরিমাণকে ব্যবহার করে এবং সম্ভবত আরও দক্ষ হতে পারে।

আপনার ক্ষেত্রে, রেজেক্সটি হ'ল:

/(\[[^\]]++\])/

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

/(\[[^\]]+\])/

আরো দেখুন


দ্রুত সংক্ষিপ্তসার

*   Zero or more, greedy
*?  Zero or more, reluctant
*+  Zero or more, possessive

+   One or more, greedy
+?  One or more, reluctant
++  One or more, possessive

?   Zero or one, greedy
??  Zero or one, reluctant
?+  Zero or one, possessive

মনে রাখবেন যে অনিচ্ছুক এবং অধিকারী কোয়ান্টিটিফায়ারগুলি সীমাবদ্ধ পুনরাবৃত্তি {n,m}নির্মাণের ক্ষেত্রেও প্রযোজ্য are

জাভা উদাহরণ:

System.out.println("aAoZbAoZc".replaceAll("A.*Z", "!"));  // prints "a!c"
System.out.println("aAoZbAoZc".replaceAll("A.*?Z", "!")); // prints "a!b!c"

System.out.println("xxxxxx".replaceAll("x{3,5}", "Y"));  // prints "Yx"
System.out.println("xxxxxx".replaceAll("x{3,5}?", "Y")); // prints "YY"

আমি আপনার কাজগুলিকে আমার কাজটিতে অনুলিপি করছি এবং ফলাফলটি হ'ল: অবৈধ কোয়ান্টিফায়ার + \]) [এই ত্রুটিটি ভাঙ্গা] var ফিল্টারডেটা = তাকডাটা.ম্যাচ (/ (\ [[^ \]] ++ \]) /);) \ n ( ফায়ারব্যাগ + ফায়ারফক্স) কিছু ভুল?
রুটিয়া

@ রুয়েটা: স্পষ্টত জাভাস্ক্রিপ্টের স্বাদ অধিকারী নয়। আমি এই উত্তরটি প্রতিফলিত করতে আমার উত্তর সম্পাদনা করেছি। আপনি +দুজনের পরিবর্তে একটি ব্যবহার করতে পারেন ।
বহুবিশ্লেষকরা

1
যদিও অধিকারী কোয়ান্টিফায়ারগুলির জায়গায় পারমাণবিক গোষ্ঠীগুলি ব্যবহার করা যেতে পারে তবে জাভাস্ক্রিপ্ট পারমাণবিক দলগুলিকে সমর্থন করে না। তবে তৃতীয় বিকল্প রয়েছে, এটি দেখুন: উদাহরণস্বরূপ.মি / পোস্টyou can emulate atomic grouping with LookAhead. (?>a) becomes (?=(a))\1
52245507631/…

2
এটি একটি জাভাস্ক্রিপ্ট প্রশ্ন এবং জাভা! = জাভাস্ক্রিপ্টের জন্য একটি জাভা উত্তর। পাঠকগণ, দ্রষ্টব্য।
রোশম্বো

3

আমি বিশ্বাস করি এটি এমন হবে

takedata.match(/(\[.+\])/g);

gশেষে বিশ্বব্যাপী মানে, তাই এটি প্রথম ম্যাচ থামবে না।


হ্যাঁ, আপনি ঠিক / জি-তে রয়েছেন। আমি আপনার উত্তর / জি with দিয়ে সবেমাত্র আমার কাজটি করেছি ^^ তবে আমি যখন নিয়মিত /(\sel.+\ চাপ)/g করি তখন আমার ফলাফলটি হ'ল: [| আমার |] :(
রুটিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.