2012-04-14 21 views
5

में पिछले मिलान किए गए समूहों के संदर्भ में मैं एंड्रॉइड कोडिंग के लिए नया हूं, लेकिन मुझे पर्ल रेगेक्स के साथ अनुभव है। (\ W \ घ \ घ \ घ) एंड्रॉयड कोड यह होगा के लिएरेगेक्स

^\s*((\w\d\d\d)(\s+$2)*)?$ 

नोट $ 2 पिछले मिलान किया समूह को संदर्भित करता: मैं एक नियमित की तरह अभिव्यक्ति के साथ 0 या अधिक पहचानकर्ता की एक सूची मिलान करने की आवश्यकता देखो की तरह:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\$2)*)?$") 

ग्रहण संकलक \ $ 2 संकलन नहीं करता है, मैं भी \ 2 की कोशिश की है, जो संकलित लेकिन एक शाब्दिक संख्या 2.

जानवर बल समाधान मैच के लिए पहचानकर्ता को दोहराने के लिए किया जाएगा की कोशिश करता है पैटर्न:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+(\\w\\d\\d\\d))*)?$") 

यह काम करता है, लेकिन यह निम्न नुकसान हैं: * यह या तो पुनरावृत्ति में एक सिंटैक्स त्रुटि बनाने के लिए * पहचानकर्ता और अधिक जटिल स्ट्रिंग बड़ा * यह सुरुचिपूर्ण नहीं है हो जाता हो जाता है के रूप में आसान है * यदि आपको किसी को संदर्भित करने की आवश्यकता नहीं है तो बहुत अधिक जटिल हो जाता है लेकिन कई पिछले मैचों

क्या रीगिक्स के भीतर पिछले मिलान किए गए समूहों को संदर्भित करने के लिए जावा में कोई तरीका है?

+0

क्या आपने 'Pattern.compile ("^\\ s * ((\\ w \\ d \\ d \\ d) (\\ s + \\ 2) *)? $ ") की कोशिश की है, मुझे लगता है कि बैकरेफर \ N जहां एन आपका समूह है। यद्यपि आपको बैकस्लैश को '\\ एन' –

+0

के साथ बैकस्लैश करना है, हां, मेरे पास है, यह \\ 2 को शाब्दिक संख्या 2 के रूप में लेता है (मैं मूल पोस्ट में बैकस्लैश को दोगुना करना भूल गया था, लेकिन यह मेरा मतलब था)। – ilomambo

उत्तर

0

मैं भ्रम की स्थिति है, मेरे भ्रम की स्थिति के बारे में माफी चाहता हूँ। regex:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$") 

, जैसे "ए 12 ए 12" कुछ की पूर्ति करेंगे, इसलिए पिछले मैच मिलान। (मैंने बस इसे ग्रहण पर आज़माया और डीबगर के साथ इसका पालन किया)

जो मैं चाहता था वह "ए 12 बी 35 सी 36 ए011" जैसे स्ट्रिंग के लिए एक लघु रेगेक्स लिखने का एक तरीका है, आप चर का उपयोग कर सकते हैं पैटर्न, इसलिए इसे perl में किया जा सकता है:

$a='\w\d\d\d'; 
$mystring =~ /^\s*(($a(\s+$a)*)?$/; 

लघु और सरल। इसलिए मैं जावा में ग्रहण यह भी तार श्रृंखलाबद्ध के द्वारा किया जा सकता है (मैं सिर्फ यह कोशिश की और यह काम करता है)

String id="\\w\\d\\d\\d"; 
Pattern.compile("^\\s*(" + id + "(\\s+" + id + ")*)?$"); 

यह सुंदर नहीं है, लेकिन यह काम करता है।

+1

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

0

याद रखें कि न केवल $ से बचने की आवश्यकता है, लेकिन \ को बचने की जरूरत है!

तो आप की जरूरत:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$") 
+0

मुझे गलत लगा, मुझे पता चला कि मेरे रेगेक्स में क्या गलत है। मैं 7 घंटे (न्यूबीज प्रतिबंध) – ilomambo