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