गैर-लालची में नियमित अभिव्यक्ति कैसे करें?


226

मैं jQuery का उपयोग कर रहा हूँ। मेरे पास विशेष वर्ण (आरंभ और अंत) के ब्लॉक के साथ एक स्ट्रिंग है। मैं उस विशेष वर्ण ब्लॉक से पाठ प्राप्त करना चाहता हूं। मैंने इन-स्ट्रिंग ढूँढने के लिए एक नियमित अभिव्यक्ति ऑब्जेक्ट का उपयोग किया। लेकिन मैं दो विशेष चरित्र या अधिक होने पर कई परिणाम प्राप्त करने के लिए jQuery को कैसे बता सकता हूं?

मेरा HTML:

<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 |] ch kng khoán [| Mỹ | day la nococ my]] । लेकिन यह वह परिणाम नहीं है जो मैं चाहता हूं :(? 1 बार के लिए [पाठ] कैसे प्राप्त करें और 2 बार के लिए [डेमो]?


मैंने अभी इंटरनेट ^ ^ पर जानकारी खोजने के बाद अपना काम किया है। मैं इस तरह कोड बनाता हूं:

var filterdata = takedata.match(/(\[.*?\])/g);
  • मेरा परिणाम है: [| cơ thử | nghi |m |], [| test2 | đây là test l ln 2 |] यह सही है !. लेकिन मैं वास्तव में यह नहीं समझता। क्या आप मेरा जवाब दे सकते हैं?

जवाबों:


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'
हाशबोर्न

1
कैसे सी कुछ भी नहीं मिला
मुहम्मद उमर

1
@MuhammadUmer मुझे लगता है कि वह सुझाव दे रहे थे कि क्योंकि cमैच नहीं होगा, लेकिन आपके पास है ?, जो है 0 or 1, तो यह मैच होने वाला है 0 number of c characters, इसलिए इसकी जगह ले रहा है। मुझे नहीं पता कि यह कैसे काम करता है, क्योंकि यह किसी भी रेगेक्स इंजन में संकलित नहीं है, मैंने कोशिश की है 😢
Noctis

35

आप सही हैं कि लालच एक मुद्दा है:

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

यदि आप दोनों का मिलान करना चाहते हैं A--Z, तो आपको उपयोग करना होगा A.*?Z( "अनिच्छुक", या आलसी ?बनाता है *)।

ऐसा करने के लिए कभी-कभी बेहतर तरीके होते हैं, हालांकि, जैसे

A[^Z]*+Z

यह बैकग्राउंडिंग को कम करने के लिए, नकारात्मक चरित्र वर्ग और अधिकारी मात्रात्मक का उपयोग करता है, और अधिक कुशल होने की संभावना है।

आपके मामले में, रेगेक्स होगा:

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

दुर्भाग्य से जावास्क्रिप्ट regex के पास मात्रात्मक मात्रा का समर्थन नहीं करता है, इसलिए आपको बस इसके साथ करना होगा:

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

यह सभी देखें


त्वरित सारांश

*   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}निर्माणों पर भी लागू होते हैं ।

जावा में उदाहरण:

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"

मैं अपने काम में अपने regex की प्रतिलिपि बनाएँ और परिणाम है: अमान्य क्वांटिफायर + \]) [इस त्रुटि पर विराम] var filterdata = takedata.match (/ (\ [[^ \]] ++ \]) /); \ n; फायरबग्स + फ़ायरफ़ॉक्स) कुछ गलत है?
रुएटा

@Rueta: जाहिरा तौर पर जावास्क्रिप्ट स्वाद का समर्थन नहीं करता है। मैंने इस तथ्य को दर्शाने के लिए अपना उत्तर संपादित किया है। आप केवल +दो के बजाय एक का उपयोग कर सकते हैं ।
पॉलीजेन लुब्रिकेंट

1
हालांकि परमाणु समूहों का उपयोग मात्रात्मक मात्रात्मक के स्थान पर किया जा सकता है, जावास्क्रिप्ट परमाणु समूहों का समर्थन नहीं करता है। : लेकिन एक तिहाई दूसरा रास्ता नहीं है, यह देखने instanceof.me/post/52245507631/... -you can emulate atomic grouping with LookAhead. (?>a) becomes (?=(a))\1
रोलाण्ड Pihlakas

2
यह एक जावास्क्रिप्ट प्रश्न और जावा! = जावास्क्रिप्ट के लिए एक जावा उत्तर है। पाठकों, ध्यान दें।
रोशाम्बो

3

मेरा मानना ​​है कि यह इस तरह होगा

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

gअंत में वैश्विक मतलब है, तो यह पहले मैच में बंद नहीं करता है।


हाँ, आप सही हैं / जी। मैं सिर्फ अपने जवाब / जी ^ ^ के साथ मेरा काम किया है। लेकिन जब मैं नियमित रूप से / / ♥ करते हैं। my |] :(
रुएता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.