2016-02-07 3 views
5

मैं एक पाठ फ़ाइल के अंदर एक्सएमएल के एक ब्लॉक की पहचान करने के लिए रेगुलर एक्सप्रेशन का विकास किया है।क्या [ s एस] * क्या अंतर है? तथा ।*? जावा नियमित अभिव्यक्ति में?

<\?xml\s+version="[\d\.]+"\s*\?>\s*<\s*rdf:RDF[^>]*>[\s\S]*?<\s*\/\s*rdf:RDF\s*> 

तो मैं यह अनुकूलित और .*? साथ [\s\S]*? प्रतिस्थापित यह अचानक एक्सएमएल पहचानने बंद कर दिया: अभिव्यक्ति की तरह इस (मैं हटा दिया है सब जावा भागने उसे आसानी से पढ़ा बनाने के लिए स्लैश) लग रहा है।

जहाँ तक मुझे पता है, \s सभी सफेद-अंतरिक्ष प्रतीकों का अर्थ है और \S सभी गैर सफेद से स्थान दिया गया प्रतीकों या [^\s] तो [\s\S] तार्किक होना चाहिए . के बराबर मैं लालची फिल्टर का उपयोग नहीं किया, तो क्या फर्क हो सकता है इसका मतलब है ?

+3

डिफ़ॉल्ट रूप से '.' लाइन विभाजक से मेल नहीं खाता है।यदि आप 'Patter.DOTALL' ध्वज का उपयोग करते हैं तो यह सभी वर्णों (लाइन विभाजक सहित) से मेल खा सकता है। '[\ s \ S] 'सेट है जिसमें सभी व्हाइटस्पेस और सभी गैर-व्हाइटस्पेस \ S शामिल हैं, जो प्रभावी रूप से सभी वर्णों (लाइन विभाजक सहित) का प्रतिनिधित्व करते हैं। – Pshemo

+0

पिछला? दोनों मामलों में कुछ भी योगदान नहीं करता है। – EJP

+0

एक बहुत संबंधित एक: [* इन RegEx *] (http://stackoverflow.com/a/14648811/3832970) –

उत्तर

6

रेगेक्स एक्सप्रेशन . और \s\S समकक्ष नहीं हैं, क्योंकि . डिफ़ॉल्ट रूप से लाइन टर्मिनेटर (जैसे नई लाइन) नहीं पकड़ता है।

oracle website के अनुसार, .

किसी भी चरित्र (या लाइन टर्मिनेटर्स से मेल नहीं हो सकता है)

से मेल खाता है, जबकि एक लाइन टर्मिनेटर निम्न में से कोई है:

  • एक नई पंक्ति (लाइन फ़ीड) चरित्र ('\n'),
  • एक गाड़ी-रिटर्न चरित्र, एक नई पंक्ति वर्ण ("\r\n") द्वारा तुरंत बाद
  • एक स्वसंपूर्ण गाड़ी-रिटर्न चरित्र ('\r'),
  • एक अगली लाइन चरित्र ('\u0085'),
  • लाइन-विभाजक वर्ण ('\u2028'), या
  • एक पैरा-विभाजक वर्ण ('\u2029)।

दो भाव समान नहीं होते हैं, आवश्यक झंडे सेट नहीं हैं जब तक। फिर ओरेकल वेबसाइट के हवाले से: UNIX_LINES मोड सक्रिय है

है, तो केवल लाइन टर्मिनेटर्स मान्यता प्राप्त newline वर्ण हैं।

नियमित अभिव्यक्ति . टर्मिनेटर को छोड़कर किसी भी वर्ण से मेल खाती है जब तक DOTALL ध्वज निर्दिष्ट नहीं किया जाता है।

+1

हां, अंतर को समझाएगा, धन्यवाद – Dmitry

2

Here सभी रेगेक्स आदेशों को समझाते हुए एक शीट है।

असल में, \s\S न्यूलाइन समेत सभी पात्रों को पिकअप करेगा। जबकि . डिफ़ॉल्ट प्रति नहीं पिक लाइन टर्मिनेटर्स करता है (कुछ झंडे उन्हें लेने के लिए तय करने की आवश्यकता)।

+0

के बीच क्या अंतर है हां, हर \ डबल से बच गया है। मैंने इसे पढ़ने में आसान बनाने के लिए बस डबल स्लेश हटा दिए हैं। अभिव्यक्ति काम करती है, लेकिन जैसे ही मैं '[\ s \ S] *? '' * * के साथ बदलता हूं, काम करने के लिए बंद हो जाता है, इसलिए अंतर होना चाहिए। – Dmitry

+0

यह वास्तविक अभिव्यक्ति है: '<\\? Xml \\ s + version = \" [\\ d \\।] + \ "\\ s * \\?> \\ s * <\\ s * rdf: आरडीएफ [^>] *> [\\ एस \\ एस] *? <\\ एस * \\/\\ एस * rdf: आरडीएफ \\ एस *> ' – Dmitry

+0

यह सच नहीं है। कुछ झंडे के आधार पर नई लाइनों से बच सकते हैं। सभी विवरणों के लिए मेरे उत्तर पर एक नज़र डालें .. –

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