regex

2010-10-06 16 views
7

का उपयोग कर स्ट्रिंग से मेल नहीं कर सकते मैं कुछ regex पर काम कर रहा हूँ और मुझे आश्चर्य है कि क्यों इस regexregex

"(?<=(.*?id((*)=)\\s[\"\']))g" 

स्ट्रिंग

<input id = "g" /> 

जावा में से मेल नहीं खाता?

+0

'तत्व इनपुट = document.select (" [id = g] ");' – BalusC

उत्तर

2

न केवल जावा असंबद्ध दिखने की इजाजत देता है, अगर आप कोशिश करते हैं तो अपवाद फेंकना चाहिए। तथ्य यह है कि आप उस अपवाद को नहीं देख रहे हैं itself a bug है।

आपको वैसे भी इसके लिए देखने का उपयोग नहीं करना चाहिए। यदि आप किसी निश्चित विशेषता के मान से मेल खाना चाहते हैं, तो सबसे आसान, कम से कम परेशानी वाला दृष्टिकोण संपूर्ण विशेषता से मेल खाता है और मूल्य निकालने के लिए कैप्चरिंग समूह का उपयोग करना है। उदाहरण के लिए:

String source = "<input id = \"g\" />"; 
Pattern p = Pattern.compile("\\bid\\s*=\\s*\"([^\"]*)\""); 
Matcher m = p.matcher(source); 
if (m.find()) 
{ 
    System.out.printf("Found 'id' attribute '%s' at position %d%n", 
        m.group(1), m.start()); 
} 

आउटपुट:

Found 'id' attribute 'g' at position 7 

खुद पर एक एहसान करो और थोड़ी देर के लिए lookbehinds के बारे में भूल जाते हैं। वे तब भी मुश्किल होते हैं जब वे छोटी गाड़ी नहीं होते हैं, और वे वास्तव में उतनी उपयोगी नहीं हैं जितनी आप उम्मीद कर सकते हैं।

6

Java.util.regex अनंत लुक-पीछे का समर्थन नहीं करता, RegexBuddy द्वारा में बताए अनुसार:

बुरी खबर यह है कि ज्यादातर regex जायके आप एक के अंदर सिर्फ किसी भी regex का उपयोग करने की अनुमति नहीं है देखो, क्योंकि वे नियमित अभिव्यक्ति पीछे की ओर लागू नहीं कर सकते हैं। इसलिए, नियमित अभिव्यक्ति इंजन को पर सक्षम होने की आवश्यकता है, यह देखने के लिए कि वापस देखने के पहले कितने कदम पीछे हटने की आवश्यकता है।

प्रलेखन से थोड़ी स्पष्टीकरण जोड़ने के लिए:

इसलिए, कई regex जायके, , पर्ल और अजगर द्वारा इस्तेमाल किया उन सहित केवल अनुमति देते हैं निर्धारित लंबाई तार। आप के किसी भी रेगेक्स का उपयोग कर सकते हैं, जो मैच की लंबाई पूर्व निर्धारित हो सकती है। इसका मतलब है कि आप शाब्दिक पाठ और चरित्र वर्गों का उपयोग कर सकते हैं। आप पुनरावृत्ति या वैकल्पिक आइटम का उपयोग नहीं कर सकते हैं। आप वैकल्पिकता का उपयोग कर सकते हैं, लेकिन केवल तभी जब में सभी विकल्प समान लंबाई हैं।

कुछ regex जायके, PCRE और जावा की तरह ऊपर, प्लस अलग-अलग लंबाई के तार के साथ प्रत्यावर्तन समर्थन करते हैं। विकल्प का प्रत्येक भाग होना चाहिए अभी भी एक सीमित अधिकतम लंबाई है। इसका मतलब है कि आप अभी भी स्टार या प्लस का उपयोग नहीं कर सकते हैं, लेकिन आप निर्दिष्ट पैरामीटर के साथ प्रश्न चिह्न और घुंघराले ब्रेसिज़ का उपयोग कर सकते हैं। ये रेगेक्स स्वाद तथ्य को पहचानते हैं कि परिमित पुनरावृत्ति अलग-अलग, लेकिन निश्चित लंबाई के साथ स्ट्रिंग्स के एक विकल्प के रूप में पुनः लिखा जा सकता है। दुर्भाग्यवश, जेडीके 1.4 और 1.5 में कुछ बग हैं जब आप को देखने के अंदर विकल्प का उपयोग करते हैं। ये जेडीके 1.6 में तय किए गए थे।

+0

वह पाठ ट्यूटोरियल के पुराने संस्करण से है, और यह बहुत खराब शब्द है। उनकी वेबसाइट पर अपडेटेड संस्करण बहुत स्पष्ट है: http://www.regular-expressions.info/lookaround.html पीसीआरई उन विकल्पों को स्वीकार करता है जिनमें प्रत्येक विकल्प निश्चित-लंबाई है लेकिन जरूरी नहीं कि सभी * समान * लंबाई। उस पैराग्राफ में हर चीज अकेले जावा पर लागू होती है। –

0

java.util.regex lookbehind अंदर अनंत पुनरावृत्ति का समर्थन नहीं करता

2

ताकि लोगों के एक जोड़े समझा दिया है जिनकी वजह से आपके regexp काम नहीं कर रहा है (और यह वास्तव में घातक है, जावा नियमित अभिव्यक्ति क्या ऐसा नहीं कर सकते आप की जरूरत है)। हालांकि, आप सोच सकते हैं कि अब आपको इसे कैसे पार्स करना चाहिए ...

ऐसा लगता है कि जिस स्ट्रिंग को आप पार्स करने की कोशिश कर रहे हैं वह XML है। रेगेक्स एक्सएमएल पार्स करने के लिए वास्तव में एक अच्छा तरीका नहीं है; XML में एन्कोड किए जा सकने वाले कार्यों के बीच एक विसंगति है और नियमित अभिव्यक्तियों का उपयोग करके मिलान किया जा सकता है। तो अगर यह कुछ एक्सएमएल पाठ का हिस्सा है, तो शायद इसे एक एक्सएमएल पार्सर में फिसलने पर विचार करें जिसे आप विभिन्न तत्वों के लिए पूछ सकते हैं।

इस समस्या की एक शांत और उचित चर्चा के लिए, इस क्लासिक स्टैक ओवरफ्लो पोस्ट को देखें: RegEx match open tags except XHTML self-contained tags

आशा है कि इससे मदद मिलती है!

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