2011-12-28 22 views
6

स्ट्रिंग निम्न में से एक की तरह हो सकता है:नियमित अभिव्यक्तियों का उपयोग करके मैं पैटर्न को दोबारा कैसे मिलान कर सकता हूं?

a(b,c) 
a(a(b,c),d) 
a(a(a(a(a(b,c),d),a(e,f)),g),h) 
etc 

मैं की एक असीमित संख्या में मैच के लिए "एक (एक्स, वाई)" चाहते हैं। रेगेक्स का उपयोग करके मैं यह कैसे कर सकता हूं? यहां मेरे पास है:

\\w\\(((?:\\([a-zA-Z0-9]+\\))|(?:[a-zA-Z0-9]+)),((?:\\([a-zA-Z0-9]+\\))|(?:[a-zA-Z0-9]+))\\) 

यह केवल "ए (एक्स, वाई)" के दो रिकर्सन से मेल खाता है।

उत्तर

6

जावा का मानक regex lib रिकर्सन का समर्थन नहीं करता है, इसलिए आप इसके साथ इस तरह के सामान्य नेस्टेड संरचनाओं से मेल नहीं खा सकते हैं।

लेकिन जायके कि समर्थन प्रत्यावर्तन करना (पर्ल, PCRE, नेट, आदि) आप की तरह उपयोग कर सकते हैं भाव में:

\w+(?:\((?R)(?:,(?R))*\))? 
+0

क्या आप वाकई पाइथन की ऐसी सुविधा रखते हैं? AFAIK, केवल PHP, .NET और पर्ल ऐसी चालबाजी करने में सक्षम हैं। –

+0

@ बार्टकिअर्स, सही, पायथन में '(? आर)' और दोस्तों नहीं हैं, किसी कारण से मैंने सोचा कि इसके रेगेक्स इंजन के नए संस्करणों ने इसका समर्थन किया है। इसे सूची से हटा दिया गया। – Qtax

+0

मैं पाइथन से बहुत परिचित नहीं हूं, इसलिए मैंने सोचा कि वे इसे v3 में शामिल करते हैं (जिसे मैंने वास्तव में नहीं देखा है)। –

0

जिस भाषा का आप वर्णन कर रहे हैं वह regular language नहीं है, इसलिए इसे नियमित अभिव्यक्ति से मेल नहीं किया जा सकता है। lexical analysis में देखो

+9

-1। Regex (इस संदर्भ में) नियमित नहीं हैं, और वे अब 25+ साल के लिए नहीं रहे हैं। – Qtax

+4

नाइटपिक: शब्दावली विश्लेषण नियमित अभिव्यक्तियों पर आधारित है; शब्दावली विश्लेषण नियमित अभिव्यक्तियों द्वारा परिभाषित नियमों के अनुसार अक्षरों की एक धारा में अक्षरों की एक धारा में बदल जाता है। वह चीज जो समस्या को हल करती है जिसे पूछताछ करने वाला पूछताछ करता है वह पार्सर जेनरेटर है। –

+3

@robert, (जाहिर है?) क्यूटीएक्स का मतलब ओएस-टूल्स/प्रोग्रामिंग एपीआई में रेगेक्स था। उस संदर्भ में रेगेक्स में कुछ ऐसा मिलान करने की क्षमता थी जो पहले (समूहबद्ध और बैक-रेफरेंसिंग) से मेल खाती थी: उन्हें नियमित भाषाओं से अधिक मिलान करने में सक्षम बनाता है। –

-1

(यानी एक पार्सर का उपयोग करें) मुझे लगता है कि आप की तरह कुछ के लिए देख रहे हैं:

एक (एक्स, वाई) = [az] ([az], [az])

regex = ए (एक्स, वाई) | ए (रेगेक्स | वाई) | ए (एक्स, रेगेक्स)

सुनिश्चित नहीं है कि आप किसी भाषा में कैसे कर सकते हैं।

+5

... यह कोई जवाब नहीं है। –

0

2 विकल्प - & प्रतिस्थापन मिलान पैटर्न क्या करना 1) का प्रयोग करें शाब्दिक विश्लेषण अपने आप पर [OR] 2) यदि आप रेगेक्स से चिपकना चाहते हैं तो कुछ खोल प्रोग्रामिंग (या किसी भी सहायक भाषा) का उपयोग करें & इसे जावा से कॉल करें।

0

आप मेरी नियमित अभिव्यक्ति लाइब्रेरी https://github.com/florianingerl/com.florianingerl.util.regex का भी उपयोग कर सकते हैं, जो पुनरावर्ती नियमित अभिव्यक्तियों का समर्थन करता है! एपीआई मूल रूप से java.util.regex में से एक जैसा ही है, केवल आवश्यक आयात विवरण अलग हैं, उदा।

Pattern p = Pattern.compile("(?<first>a\\((?<second>(?'first')|[a-zA-Z]),(?'second')\\))"); 
assert p.matcher("a(a(a(a(a(b,c),d),a(e,f)),g),h)").find(); 
संबंधित मुद्दे

 संबंधित मुद्दे