2012-03-15 16 views
5

मैं निम्नलिखित regexp है।जावा RegExp समूह अस्वीकरण संभव है? <code>(["'])(\1|[^1])+1</code></p> <p>जाहिर है यह संकलित नहीं जा सका क्योंकि <code>[^1]</code> illeagal है:

क्या मिलान किए गए समूह को अस्वीकार करना संभव है?

+1

पाठ आप मैच के लिए कोशिश कर रहे हैं क्या है? आपका रेगेक्स थोड़ा उलझन में है। – beerbajay

+0

सवाल यह है कि क्या यह अन्य स्वाद/भाषाओं में संभव है? मैं कल्पना कर सकता हूं कि इस तरह के निर्माण को समझ में नहीं आता है क्योंकि एक कैप्चर समूह में एक से अधिक वर्ण हो सकते हैं, इसलिए '[^ \ 1] 'इन वर्णों की एक सूची होगी ... लेकिन यह मेरी राय है। यह भी हो सकता है कि रेगेक्स इंजन को * पहले से * पता होना चाहिए कि कौन से पात्र उम्मीद कर सकते हैं। क्या '[\ 1] 'काम करता है? –

+0

मुझे केवल यह ''regular-expression.info'] (http://www.regular-expressions.info/brackets.html) पर मिला: *" बैरलरेंस का उपयोग किसी वर्ण वर्ग के अंदर भी नहीं किया जा सकता है।' \ 1' '(ए) [\ 1b]' जैसे रेगेक्स में अधिकांश रेगेक्स स्वादों में एक ऑक्टल से बचने के रूप में व्याख्या की जाएगी। इसलिए यह रेगेक्स 'ए' से मेल खाएगा, इसके बाद या तो '\ x01' या' b' 'होगा। * * यदि आप नियमित अभिव्यक्तियों में अधिक अंतर्दृष्टि रखना चाहते हैं, मैं सुझाव देता हूं [* जेफरी फ्राइडल द्वारा नियमित अभिव्यक्तियों का मास्टरिंग] * (http://shop.oreilly.com/product/9780596528126.do)। –

उत्तर

4

आप सकारात्मक या नकारात्मक चरित्र वर्ग में बैकरेफर का उपयोग नहीं कर सकते हैं।

लेकिन आप प्राप्त कर सकते हैं का उपयोग कर आप क्या चाहते हैं नकारात्मक lookahead assertions:

(["'])(?:\\.|(?!\1).)*\1 

स्पष्टीकरण:

(["']) # Match and remember a quote. 
(?:  # Either match... 
\\.  # an escaped character 
|   # or 
(?!\1) # (unless that character is identical to the quote character in \1) 
.  # any character 
)*  # any number of times. 
\1  # Match the corresponding quote. 
+0

आपने दूसरे प्रश्न पर टिप्पणी की कि यह काम नहीं करेगा। कैसे '(["']) (\\\ 1 |।) +? \ 1'? क्या विकल्प को बाएं से दाएं से मिलान नहीं किया जाना चाहिए? या क्या मुझे यहां समस्या याद आ रही है? ऐसा लगता है कि यह ठीक है जावास्क्रिप्ट। –

+0

@ फ़ेलिक्सक्लिंग: आप सही हैं। कोष्ठक को सही स्थान पर ले जाना वास्तव में समस्या हल करता है। चलो देखते हैं कि हम एडमिबान के उत्तर को मिटा सकते हैं। –

+0

अनदेखा करने के लिए वोट दिया गया है। आपका समाधान शायद अभी भी बेहतर है क्योंकि यह बैकट्रैकिंग से बचाता है। –

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