2012-01-08 25 views
5

मैं इस रेगेक्स को समझने की कोशिश कर रहा हूं, क्या आप मेरी मदद कर सकते हैं? (?s) regex कि मुझे समझ में नहीं आता

  • क्यों डबल \\} से पहले:

    (?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\} 
    
    • मैं वास्तव में DOTALL का अर्थ समझ में नहीं आता?
    • क्या यह वास्तव में क्या मतलब है: (.+?) (हम इस तरह पढ़ना चाहिए: ., तो +. पर अभिनय, तो ?.+
  • +4

    स्रोत जहां आप यह देख में, यह एक स्ट्रिंग शाब्दिक में है ? उदाहरण के लिए, क्या यह वास्तव में 'पैटर्न पी = Pattern.compile (" (? एस) \\ {\\ {wotd \\ | (। +?) \\ | (। +?) \\ | ([^ # \\ |]) * \\} \\} ");'।? यह मायने रखता है, क्योंकि बैकस्लाश स्ट्रिंग अक्षर और नियमित अभिव्यक्तियों में दोनों से बच निकलती हैं, इसलिए '\\ {' की व्याख्या करने के लिए हमें यह जानने की ज़रूरत है कि क्या यह '\\ {" 'है (जिस स्थिति में' \\ 'देखा जाता है पैटर्न कंपाइलर को एक बैकस्लैश के रूप में जो निम्नलिखित '{') से बचता है या यह '\\ {'(उदाहरण के लिए, टेक्स्ट फ़ाइल या किसी चीज़ से पढ़ा जाता है), जिस स्थिति में पैटर्न कंपाइलर एक * बच निकला * बैकलाश देखता है जिसके बाद' { '। –

    +0

    '। +' एक गैर लालची ("अनिच्छुक") '+' ऑपरेटर है। '\\\' का मतलब शाब्दिक बैकस्लैश है, मानते हैं कि रेगेक्स जावा है और जावा स्ट्रिंग में एम्बेडेड है, पहला '\\' दूसरे से बच निकला है। –

    उत्तर

    8

    इस regex एक स्ट्रिंग से है का परिणाम का जवाब?। "प्रामाणिक" regex है:

    (?s)\{\{wotd\|(.+?)\|(.+?)\|([^#\|]+).*?\}\} 
    

    DOTALL संशोधक का मतलब है कि डॉट भी एक नई पंक्ति वर्ण से मेल कर सकते हैं, लेकिन ऐसा चरित्र वर्गों पूरित कर सकते हैं, कम से कम जावा के साथ: IE [^a] होगा प्रत्येक चरित्र से मेल खाता है जो a नहीं है, नई लाइन शामिल है। कुछ रेगेक्स इंजन पूरक चरित्र वर्गों में एक नई लाइन से मेल नहीं खाते हैं (हालांकि इसे एक बग के रूप में माना जा सकता है)।

    +? और *? आलसी क्वांटिफायर (जिन्हें आम तौर पर टाला जाना चाहिए) हैं। इसका मतलब है कि उन्हें प्रत्येक चरित्र से पहले देखना होगा कि वे यह देखने के लिए निगलना चाहते हैं कि यह चरित्र रेगेक्स के अगले घटक को संतुष्ट कर सकता है या नहीं।

    तथ्य यह है कि { और }\ साथ पहले कर रहे हैं क्योंकि {...} पुनरावृत्ति परिमाणक है {n, m} जहां n और मीटर पूर्णांक हैं।

    इसके अलावा, चरित्र श्रेणी [^#\|] में पाइप | से बचने के लिए बेकार है, इसे आसानी से [^#|] के रूप में लिखा जा सकता है।

    और अंत में, .*? अंत में शेष क्षेत्रों को निगलने लगता है। normal* (special normal*)* पैटर्न का उपयोग करने का एक बेहतर विकल्प है, जहां normal[^|}] और special\| है।

    यहां आलसी क्वांटिफायर, "निश्चित" वर्ण वर्ग और संशोधित अंत का उपयोग किए बिना रेगेक्स है। ध्यान दें कि DOTALL आपरिवर्तक के रूप में अच्छी तरह से गायब हो गया है, के बाद से डॉट अब और नहीं किया जाता है: कदम से

    \{\{wotd\|([^|]+)\|([^|]+)\|([^#|]+)[^|}]*(?:\|[^|}]*)*\}\} 
    

    कदम:

    \{\{   # literal "{{", followed by 
    wotd   # literal "wotd", followed by 
    \|   # literal "|", followed by 
    ([^|]+)  # one or more characters which are not a "|" (captured), followed by 
    \|   # literal "|", followed by 
    ([^|]+)  # one or more characters which are not a "|" (captured), followed by 
    \|   # literal "|", followed by 
    ([^#|]+)  # one or more characters which are not "|" or "#", followed by 
    [^|}]*  # zero or more characters which are not "|" or "}", followed by 
    (?:   # begin group 
        \|   # a literal "|", followed by 
        [^|}]*  # zero or more characters which are not "|" or "}" 
    )   # end group 
    *   # zero or more times, followed by 
    \}\}   # literal "}}" 
    
    +0

    आलसी क्वांटिफायर से बचने के लिए आप सुझाव क्यों देते हैं? – Lucero

    +0

    यह ध्यान दिया जाना चाहिए कि आपका रेगेक्स मूल के बराबर नहीं है; मूल कई तारों से मेल खाएगा जो आपका नहीं होगा। अगर मुझे लगता है कि, मुझे लगता है कि आपका संस्करण रेगेक्स-लेखक के मूल उद्देश्य के करीब है, लेकिन यह जानने के बिना कि आवश्यकताएं क्या हैं, निश्चित रूप से जानने का कोई तरीका नहीं है। (और वैसे, आप अपने संस्करण से '(? S) को भी हटा सकते हैं, क्योंकि आपका संस्करण वैसे भी '.' का उपयोग नहीं करता है।) – ruakh

    +0

    कोई अंतिम'। *? 'का अर्थ नहीं है क्योंकि अन्य पाइप भी बच निकले हैं (जो आपकी अंतिम रेगेक्स बूंदें)। रेगेक्स एक स्ट्रिंग की तलाश में है जहां पाइप को फ़ील्ड डिलीमीटर के रूप में उपयोग किया जाता है: '{wotd | field1 | field2 | some_stuff # संभवतः एक टिप्पणी?}' – user268396

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