Erlang 21

re




erlang

re

मॉड्यूल

फिर से

मॉड्यूल सारांश

एरलंग के लिए पर्ल-जैसे नियमित अभिव्यक्ति।

विवरण

इस मॉड्यूल में स्ट्रिंग्स और बायनेरिज़ के लिए नियमित अभिव्यक्ति मिलान कार्य शामिल हैं।

regular expression वाक्य रचना और शब्दार्थ पर्ल के समान होते हैं।

पुस्तकालय के मिलान एल्गोरिदम पीसीआरई पुस्तकालय पर आधारित हैं, लेकिन पीसीआरई पुस्तकालय के सभी हस्तक्षेप नहीं किए जाते हैं और पुस्तकालय के कुछ हिस्से पीसीआरई की पेशकश से परे जाते हैं। वर्तमान में पीसीआरई संस्करण 8.40 (रिलीज की तारीख 2017-01-11) का उपयोग किया जाता है। पीसीआर प्रलेखन के खंड जो इस मॉड्यूल के लिए प्रासंगिक हैं, उन्हें यहां शामिल किया गया है।

ध्यान दें

तार के लिए Erlang शाब्दिक सिंटैक्स "\" (बैकस्लैश) वर्ण का उपयोग एस्केप कोड के रूप में करता है। आपको अपने कोड में और शेल में, शाब्दिक तार में बैकस्लैश से बचने की आवश्यकता है, अतिरिक्त बैकस्लैश के साथ, अर्थात "\\"।

जानकारी का प्रकार

mp() = {re_pattern, term(), term(), term(), term()}

अपारदर्शी डेटा प्रकार जिसमें एक संकलित नियमित अभिव्यक्ति होती है। re_pattern () को गार्ड में मिलान के लिए अनुमति देने के लिए एटम re_pattern को इसके पहले तत्व के रूप में होने की गारंटी है। भविष्य के अर्लंग / ओटीपी रिलीज में टपल या अन्य क्षेत्रों की सामग्री की गंभीरता बदल सकती है।

nl_spec() = cr | crlf | lf | anycrlf | any
compile_option() =
unicode |
anchored |
caseless |
dollar_endonly |
dotall |
extended |
firstline |
multiline |
no_auto_capture |
dupnames |
ungreedy |
{newline, nl_spec() } |
bsr_anycrlf |
bsr_unicode |
no_start_optimize |
ucp |
never_utf

निर्यात

संस्करण () -> बाइनरी ()

इस फ़ंक्शन की वापसी सिस्टम के पीसीआरई संस्करण के साथ एक स्ट्रिंग है जिसका उपयोग एरलांग / ओटीपी संकलन में किया गया था।

संकलन (Regexp) -> {ठीक है, एमपी} | {त्रुटि, इरसेपेक}

प्रकार

compile(Regexp,[]) समान compile(Regexp,[])

संकलन (Regexp, विकल्प) -> {ठीक है, एमपी} | {त्रुटि, इरसेपेक}

प्रकार

नीचे बताए गए वाक्यविन्यास के साथ एक नियमित अभिव्यक्ति संकलित करता है, बाद में run/2 और run/3 पैरामीटर के रूप में उपयोग किए जाने वाले एक आंतरिक प्रारूप में।

मिलान से पहले नियमित अभिव्यक्ति को संकलित करना उपयोगी है यदि उसी अभिव्यक्ति का उपयोग कार्यक्रम के जीवनकाल के दौरान कई विषयों के विरुद्ध मिलान में किया जाए। एक बार संकलित करना और कई बार निष्पादित करना हर बार संकलित करने की तुलना में कहीं अधिक कुशल होता है।

जब विकल्प unicode निर्दिष्ट किया जाता है, तो नियमित अभिव्यक्ति को एक वैध यूनिकोड charlist() रूप में निर्दिष्ट किया जाना चाहिए, अन्यथा किसी भी मान्य charlist() रूप में।

विकल्प:

unicode

नियमित अभिव्यक्ति को यूनिकोड charlist() रूप में निर्दिष्ट किया गया है और परिणामी नियमित अभिव्यक्ति कोड को एक वैध यूनिकोड charlist() विषय के विरुद्ध चलाया जाना है। यूनिकोड वर्णों का उपयोग करते समय विकल्प ucp पर भी विचार करें।

anchored

पैटर्न को "एंकर" करने के लिए मजबूर किया जाता है, अर्थात, यह स्ट्रिंग में पहले मिलान बिंदु पर खोजा जाने वाला ("विषय स्ट्रिंग") के लिए विवश है। यह प्रभाव पैटर्न में ही उपयुक्त निर्माणों द्वारा भी प्राप्त किया जा सकता है।

caseless

पैटर्न में पत्र अपरकेस और लोअरकेस अक्षर दोनों से मेल खाते हैं। यह पर्ल विकल्प /i बराबर है और एक (?i) विकल्प सेटिंग द्वारा एक पैटर्न के भीतर बदला जा सकता है। अपरकेस और लोअरकेस अक्षर आईएसओ 8859-1 वर्ण सेट के रूप में परिभाषित किए गए हैं।

dollar_endonly

पैटर्न में एक डॉलर मेटाचैकर केवल विषय स्ट्रिंग के अंत में मेल खाता है। इस विकल्प के बिना, एक डॉलर भी स्ट्रिंग के अंत में एक नई रेखा से पहले मेल खाता है (लेकिन किसी अन्य newlines से पहले नहीं)। यदि विकल्प multiline निर्दिष्ट किया जाता है, तो इस विकल्प को अनदेखा कर दिया जाता है। पर्ल में कोई समान विकल्प नहीं है, और इसे एक पैटर्न के भीतर सेट नहीं किया जा सकता है।

dotall

पैटर्न में एक डॉट सभी वर्णों से मेल खाता है, जिसमें न्यूलाइन को इंगित करना शामिल है। इसके बिना, जब नई स्थिति में वर्तमान स्थिति होती है, तो एक बिंदु मेल नहीं खाता है। यह विकल्प पर्ल विकल्प /s बराबर है और इसे एक (?s) विकल्प सेटिंग द्वारा एक पैटर्न के भीतर बदला जा सकता है। एक नकारात्मक वर्ग, जैसे कि [^a] , हमेशा नए वर्णों से मेल खाता है, इस विकल्प की सेटिंग से स्वतंत्र है।

extended

यदि यह विकल्प सेट किया गया है, तो पैटर्न के अधिकांश सफेद अंतरिक्ष वर्णों को पूरी तरह से नजरअंदाज कर दिया जाता है, जब वे बच जाते हैं या चरित्र वर्ग के अंदर। हालाँकि, अनुक्रमों के भीतर सफेद स्थान की अनुमति नहीं है (?> जैसे (?> जो विभिन्न कोष्ठक उपपट्टों का परिचय देते हैं, और न ही एक संख्यात्मक परिमाणक जैसे कि {1,3} । हालांकि, एक आइटम और एक निम्न मात्रात्मक के बीच और एक के बीच में अनजान सफेद स्थान की अनुमति है। परिमाणक और एक निम्न + जो पूर्णता को इंगित करता है।

सफेद स्थान में VT वर्ण (कोड 11) को शामिल नहीं किया गया था, क्योंकि पर्ल ने इस वर्ण को सफेद स्थान नहीं माना था। हालांकि, पर्ल रिलीज़ 5.18 पर बदल गया, इसलिए पीसीआरई ने 8.34 रिलीज़ किया, और वीटी अब सफेद स्थान के रूप में माना जाता है।

यह एक चरित्र वर्ग के बाहर एक unescaped # के बीच वर्णों का कारण बनता है और अगली नई पंक्ति, समावेशी को अनदेखा किया जाता है। यह पर्ल /x विकल्प के बराबर है, और इसे एक (?x) विकल्प सेटिंग द्वारा एक पैटर्न के भीतर बदला जा सकता है।

इस विकल्प के साथ, जटिल पैटर्न के अंदर टिप्पणियों को शामिल किया जा सकता है। हालाँकि, ध्यान दें कि यह केवल डेटा वर्णों पर लागू होता है। व्हॉट्सएप के चरित्र विशेष चरित्र अनुक्रमों में कभी भी एक पैटर्न में नहीं दिखाई दे सकते हैं, उदाहरण के लिए अनुक्रम के भीतर (?( यह एक सशर्त शल्क का परिचय देता है)।

firstline

विषय स्ट्रिंग में पहले न्यूलाइन पर या उससे पहले मैच करने के लिए एक अनचाहे पैटर्न की आवश्यकता होती है, हालांकि मिलान किए गए टेक्स्ट को न्यूलाइन पर जारी रखा जा सकता है।

multiline

डिफ़ॉल्ट रूप से, PCRE वर्णों की एक ही पंक्ति से मिलकर विषय स्ट्रिंग का व्यवहार करता है (भले ही इसमें नई सूचियाँ हों)। "लाइन की शुरुआत" मेटाचैकर ( ^ ) केवल स्ट्रिंग की शुरुआत में मेल खाता है, जबकि "लाइन का अंत" मेटाचैकर ( $ ) केवल स्ट्रिंग के अंत में मेल खाता है, या एक टर्मिनेशन न्यूलाइन से पहले (जब तक कि विकल्प dollar_endonly है) )। यह पर्ल में भी ऐसा ही है।

जब यह विकल्प निर्दिष्ट किया जाता है, तो "लाइन की शुरुआत" और "लाइन का अंत" का निर्माण क्रमशः विषय स्ट्रिंग में आंतरिक न्यूलाइन्स से पहले या तुरंत मेल खाता है, साथ ही साथ बहुत शुरुआत और अंत में होता है। यह पर्ल विकल्प /m बराबर है और एक (?m) विकल्प सेटिंग द्वारा एक पैटर्न के भीतर बदला जा सकता है। यदि किसी विषय स्ट्रिंग में कोई नया अंक नहीं है, या किसी पैटर्न में ^ या $ की कोई घटना नहीं है, तो multiline स्थापित करने का कोई प्रभाव नहीं पड़ता है।

no_auto_capture

पैटर्न में संख्याबद्ध कैप्चरिंग कोष्ठक के उपयोग को अक्षम करता है। किसी भी उद्घाटन कोष्ठक जिसके बाद नहीं है ? व्यवहार करता है जैसे कि यह उसके बाद है ?: । नामांकित कोष्ठक अभी भी कैप्चरिंग के लिए उपयोग किया जा सकता है (और वे सामान्य तरीके से संख्या प्राप्त करते हैं)। पर्ल में कोई समान विकल्प नहीं है।

dupnames

उपपट्टियों को पकड़ने की पहचान करने के लिए उपयोग किए जाने वाले नामों को अद्वितीय नहीं होना चाहिए। यह कुछ प्रकार के पैटर्न के लिए मददगार हो सकता है जब यह ज्ञात हो कि नामित उपपट्ट के केवल एक उदाहरण का कभी भी मिलान किया जा सकता है। नामित उपपट्टों के अधिक विवरण नीचे दिए गए हैं।

ungreedy

क्वांटिफायर के "लालचीपन" का विरोध करता है ताकि वे डिफ़ॉल्ट रूप से लालची न हों, लेकिन "" के बाद लालची हो जाएं। यह पर्ल के साथ संगत नहीं है। यह पैटर्न के भीतर एक (?U) विकल्प सेटिंग द्वारा भी सेट किया जा सकता है।

{newline, NLSpec}

विषय स्ट्रिंग में एक नई पंक्ति की डिफ़ॉल्ट परिभाषा को ओवरराइड करता है, जो कि एरलांग में एलएफ (एएससीआईआई 10) है।

cr

न्यूलाइन को एकल चरित्र cr (ASCII 13) द्वारा इंगित किया गया है।

lf

न्यूलाइन को एकल वर्ण LF (ASCII 10), डिफ़ॉल्ट द्वारा इंगित किया गया है।

crlf

न्यूलाइन को दो-वर्ण CRLF (ASCII 13 के बाद ASCII 10) अनुक्रम द्वारा दर्शाया गया है।

anycrlf

तीन पूर्ववर्ती अनुक्रमों में से किसी को मान्यता दी जानी है।

any

ऊपर दी गई कोई भी नई अनुक्रमणिका, और यूनिकोड अनुक्रम VT (वर्टिकल टैब, U + 000B), FF (फॉर्मफीड, U + 000C), NEL (अगली पंक्ति, U + 0085), LS (लाइन विभाजक, U + 2028), और PS (पैराग्राफ सेपरेटर, U + 2029)।

bsr_anycrlf

विशेष रूप से निर्दिष्ट करता है कि \ R केवल CR, LF, या CRLF क्रमों से मेल खाता है, न कि यूनिकोड-विशिष्ट लाइनलाइन वर्णों से।

bsr_unicode

विशेष रूप से निर्दिष्ट करता है कि \ R सभी यूनिकोड न्यूलाइन वर्णों (CRLF सहित, और इसी तरह, डिफ़ॉल्ट पर) से मेल खाता है।

no_start_optimize

ऑप्टिमाइज़ेशन को अक्षम करता है जो कि खराबी हो सकती है यदि "विशेष स्टार्ट-ऑफ-पैटर्न आइटम" नियमित अभिव्यक्ति में मौजूद हैं। एक सामान्य उदाहरण होगा जब "(* COMMIT) ABC" के विरुद्ध "DEFABC" का मिलान, जहाँ PCRE का प्रारंभ अनुकूलन "A" तक विषय को छोड़ देगा और कभी भी यह महसूस नहीं करेगा कि (* COMMIT) निर्देश का मिलान करना है असफल। यह विकल्प केवल तभी प्रासंगिक है जब आप "स्टार्ट-ऑफ-पैटर्न आइटम" का उपयोग करते हैं, जैसा कि अनुभाग PCRE Regular Expression Details में चर्चा की गई है।

ucp

निर्दिष्ट करता है कि यूनिकोड वर्ण गुणों का उपयोग तब किया जाना चाहिए जब \ B, \ b, \ D, \ d, \ S, \ s, \ W और \ w को हल करें। इस ध्वज के बिना, केवल आईएसओ लैटिन -1 गुणों का उपयोग किया जाता है। यूनिकोड गुणों का उपयोग प्रदर्शन को नुकसान पहुंचाता है, लेकिन आईएसओ लैटिन -1 रेंज से परे यूनिकोड वर्णों के साथ काम करते समय शब्दार्थ सही है।

never_utf

निर्दिष्ट करता है कि (* UTF) और / (* UTF8) "स्टार्ट-ऑफ-पैटर्न आइटम" निषिद्ध हैं। इस ध्वज को विकल्प unicode साथ नहीं जोड़ा जा सकता है। उपयोगी यदि किसी बाहरी स्रोत से आईएसओ लैटिन -1 पैटर्न संकलित किया जाना है।

निरीक्षण (एमपी, आइटम) -> {नमस्कार, [बाइनरी ()]}

प्रकार

संकलित नियमित अभिव्यक्ति और एक आइटम लेता है, और नियमित अभिव्यक्ति से प्रासंगिक डेटा लौटाता है। एकमात्र समर्थित आइटम namelist , जो नियमित अभिव्यक्ति में सबपैटर्नस नाम के सभी (अद्वितीय) नाम वाले टपल {namelist, [binary()]} । उदाहरण के लिए:

1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
{ok,{re_pattern,3,0,0,
                <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
                  255,255,...>>}}
2> re:inspect(MP,namelist).
{namelist,[<<"A">>,<<"B">>,<<"C">>]}
3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
{ok,{re_pattern,3,0,0,
                <<69,82,67,80,119,0,0,0,0,0,8,0,1,0,0,0,255,255,255,255,
                  255,255,...>>}}
4> re:inspect(MPD,namelist).                                   
{namelist,[<<"B">>,<<"C">>]}

दूसरे उदाहरण में ध्यान दें कि डुप्लिकेट नाम केवल एक बार दी गई सूची में होता है, और यह सूची वर्णानुक्रम में होती है, जहां नाम नियमित अभिव्यक्ति में स्थित होते हैं। नामों का क्रम {capture, all_names} के क्रम के समान है यदि {capture, all_names} को run/3 विकल्प के रूप में निर्दिष्ट किया जाता है run/3 । आप इस तरह run/3 के परिणाम से नाम-से-मूल्य मैपिंग बना सकते हैं:

1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
{ok,{re_pattern,3,0,0,
                <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
                  255,255,...>>}}
2> {namelist, N} = re:inspect(MP,namelist).
{namelist,[<<"A">>,<<"B">>,<<"C">>]}
3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]).
{match,[<<"A">>,<<>>,<<>>]}
4> NameMap = lists:zip(N,L).
[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
प्रतिस्थापन (विषय, आरई, प्रतिस्थापन) -> आयोडेटा () | unicode:charlist()

प्रकार

replace(Subject, RE, Replacement, [])

बदलें (विषय, आरई, प्रतिस्थापन, विकल्प) ->
आयोडेटा () | unicode:charlist()

प्रकार

Replacement की सामग्री के साथ Subject स्ट्रिंग के मिलान वाले हिस्से को बदल देता है।

अनुमेय विकल्प run/3 लिए समान हैं, सिवाय इसके कि विकल्प capture की अनुमति नहीं है। इसके बजाय {return, ReturnType} मौजूद है। डिफ़ॉल्ट रिटर्न प्रकार iodata , जिसे कॉपी करने के लिए न्यूनतम तरीके से बनाया गया है। iodata परिणाम का उपयोग कई I / O संचालन में सीधे किया जा सकता है। यदि एक फ्लैट list() वांछित है, तो {return, list} निर्दिष्ट करें। यदि एक बाइनरी वांछित है, तो {return, binary} निर्दिष्ट करें।

जैसा कि फ़ंक्शन run/3 , एक mp() विकल्प unicode साथ संकलित करने के लिए Subject को यूनिकोड charlist() होना चाहिए। यदि संकलन को स्पष्ट रूप से किया जाता है और unicode संकलन विकल्प को इस फ़ंक्शन के लिए निर्दिष्ट किया जाता है, तो नियमित अभिव्यक्ति और Subject दोनों को वैध यूनिकोड charlist() रूप में निर्दिष्ट किया जाता है।

प्रतिस्थापन स्ट्रिंग में विशेष वर्ण & हो सकते हैं, जो परिणाम में संपूर्ण मिलान अभिव्यक्ति सम्मिलित करता है, और विशेष अनुक्रम \ N (जहां N एक पूर्णांक है 0), \g N, या \g{ N } , जिसके परिणामस्वरूप सबपेप्रेशन नंबर एन, परिणाम में डाला जाता है। यदि उस संख्या के साथ कोई उपसक्रियता नियमित अभिव्यक्ति से उत्पन्न नहीं होती है, तो कुछ भी नहीं डाला जाता है।

परिणाम में a या or \ डालने के लिए, इसे a \ _ के साथ पूर्ववर्ती करें। ध्यान दें कि Erlang पहले से ही शाब्दिक तार में एक विशेष अर्थ देता है, इसलिए एक एकल को "\\" और इसलिए एक डबल \ "\\\\" रूप में लिखा जाना चाहिए।

उदाहरण:

re:replace("abcd","c","[&]",[{return,list}]).

देता है

"ab[c]d"

जबकि

re:replace("abcd","c","[\\&]",[{return,list}]).

देता है

"ab[&]d"

जैसा कि run/3 , संकलन त्रुटियां badarg अपवाद को badarg हैं। compile/2 का उपयोग त्रुटि के बारे में अधिक जानकारी प्राप्त करने के लिए किया जा सकता है।

रन (विषय, आरई) -> {मैच, कैप्चर} | कोई मुकाबला नहीं

प्रकार

run(Subject,RE,[]) रूप में भी run(Subject,RE,[])

रन (विषय, आरई, विकल्प) ->
{मैच, कैद} | मैच | नाममात्र | {त्रुटि, त्रुटि टाइप}

प्रकार

compile/2 देखें।

एक नियमित अभिव्यक्ति से मेल खाते हैं, और match/{match, Captured} या nomatch । नियमित अभिव्यक्ति को या तो iodata() रूप में निर्दिष्ट किया जा सकता है जिस स्थिति में यह स्वचालित रूप से संकलित किया जाता है (जैसा कि compile/2 द्वारा) और निष्पादित किया जाता है, या एक पूर्व-निर्धारित mp() में जिस स्थिति में इसे सीधे विषय के विरुद्ध निष्पादित किया जाता है।

जब संकलन शामिल होता है, तो अपवाद badarg को फेंक दिया जाता है यदि संकलन त्रुटि होती है। नियमित अभिव्यक्ति में त्रुटि के स्थान के बारे में जानकारी प्राप्त करने के लिए compile/2 पर कॉल करें।

यदि नियमित अभिव्यक्ति पहले से संकलित है, तो विकल्प सूची में केवल निम्नलिखित विकल्प हो सकते हैं:

  • anchored
  • {capture, ValueSpec}/{capture, ValueSpec, Type}
  • global
  • {match_limit, integer() >= 0}
  • {match_limit_recursion, integer() >= 0}
  • {newline, NLSpec}
  • notbol
  • notempty
  • notempty_atstart
  • noteol
  • {offset, integer() >= 0}
  • report_errors

अन्यथा फंक्शन compile/2 लिए मान्य सभी विकल्पों को भी अनुमति है। विकल्पों को एक मैच के संकलन और निष्पादन दोनों के लिए अनुमति दी गई है, अर्थात् anchored और {newline, NLSpec} , संकलन और निष्पादन दोनों को प्रभावित करते हैं यदि एक गैर-precompiled नियमित अभिव्यक्ति के साथ।

यदि नियमित अभिव्यक्ति को पहले विकल्प unicode साथ संकलित किया गया था, तो Subject को एक यूनिकोड charlist() रूप में प्रदान किया जाना है, अन्यथा कोई भी iodata() करेगा। यदि संकलन शामिल है और विकल्प unicode निर्दिष्ट है, तो Subject और नियमित अभिव्यक्ति दोनों को वैध यूनिकोड charlists() रूप में निर्दिष्ट किया जाना है।

{capture, ValueSpec}/{capture, ValueSpec, Type} परिभाषित करता है कि सफल मिलान पर फ़ंक्शन से क्या लौटना है। capture ट्यूपल में वैल्यू स्पेसिफिकेशन दोनों हो सकते हैं, जिसमें बताया गया है कि कैप्चर किए गए सब्सट्रिंग्स में से किसको लौटाया जाना है, और एक टाइप स्पेसिफिकेशन, जिसमें बताया गया है कि कैप्चर किए गए सब्सट्रिंग को कैसे लौटाया जाए (इंडेक्स ट्यूपल, लिस्ट या बायनेरिज़ के रूप में)। नीचे विस्तार से विकल्पों का वर्णन किया गया है।

यदि कैप्चर विकल्प बताते हैं कि कोई भी विकल्प कैप्चरिंग नहीं किया जाना है ( {capture, none} ), फ़ंक्शन सफल मिलान पर एकल परमाणु match लौटाता है, अन्यथा टपल {match, ValueList} । कैप्चरिंग को अक्षम करना या तो none निर्दिष्ट करके या रिक्त सूची को ValueSpec रूप में निर्दिष्ट करके none किया जा सकता है।

विकल्प report_errors इस संभावना को जोड़ता है कि एक त्रुटि टपल लौटा है। ट्यूपल या तो एक मिलान त्रुटि ( match_limit या match_limit_recursion ), या एक संकलन त्रुटि को इंगित करता है, जहां त्रुटि टपल में प्रारूप {error, {compile, CompileErr}} । ध्यान दें कि यदि विकल्प report_errors निर्दिष्ट नहीं है, तो फ़ंक्शन कभी भी त्रुटि ट्यूपल्स नहीं लौटाता है, लेकिन संकलन त्रुटियों को एक badarg अपवाद के रूप में रिपोर्ट badarg है और केवल मिलान के रूप में अधिक मिलान सीमाओं के कारण विफल मैच।

निष्पादन के लिए निम्नलिखित विकल्प प्रासंगिक हैं:

anchored

पहली मिलान स्थिति में मिलान के लिए सीमाएँ run/3 । यदि एक पैटर्न को एंकरिंग के साथ संकलित किया गया था, या इसकी सामग्री के आधार पर एंकरिंग की गई थी, तो इसे मिलान समय पर अनएन्चर्ड नहीं बनाया जा सकता है, इसलिए इसमें कोई विकल्प नहीं है।

global

इम्प्लीमेंट्स ग्लोबल (दोहराए जाने वाले) खोज (पर्ल में झंडा g )। प्रत्येक मैच को एक अलग list() रूप में लौटाया जाता है list() जिसमें विशिष्ट मिलान और कोई मिलान उपमेक्शंस होते हैं (या जैसा कि विकल्प capture द्वारा निर्दिष्ट किया जाता है। रिटर्न वैल्यू का Captured भाग इसलिए list() list() इस विकल्प के निर्दिष्ट होने पर होता है।

एक नियमित अभिव्यक्ति के साथ विकल्प global की बातचीत जो एक रिक्त स्ट्रिंग से मेल खाती है, कुछ उपयोगकर्ताओं को आश्चर्यचकित करती है। जब विकल्प global निर्दिष्ट किया जाता है, तो run/3 पर्ल के समान खाली मैचों को संभालता है: किसी भी बिंदु पर एक शून्य-लंबाई मैच भी विकल्पों के साथ वापस ले लिया जाता है [anchored, notempty_atstart] । यदि वह खोज लंबाई> 0 का परिणाम देती है, तो परिणाम शामिल है। उदाहरण:

re:run("cat","(|at)",[global]).

निम्नलिखित मिलान किए जाते हैं:

ऑफसेट पर 0

स्ट्रिंग cat की प्रारंभिक स्थिति में नियमित अभिव्यक्ति (|at) पहला मैच, परिणाम सेट दे रही है [{0,0},{0,0}] (दूसरा {0,0} क्योंकि उपप्रकार द्वारा चिह्नित है) कोष्ठकों)। जैसे ही मैच की लंबाई 0 होती है, हम अगली स्थिति में आगे नहीं बढ़ते हैं।

ऑफसेट के साथ 0 पर [anchored, notempty_atstart]

खोज एक ही स्थिति में विकल्पों [anchored, notempty_atstart] साथ पुनर्प्राप्त की जाती है, जो लंबी लंबाई का कोई दिलचस्प परिणाम नहीं देती है, इसलिए खोज की स्थिति अगले चरित्र ( a ) के लिए उन्नत है।

ऑफसेट 1

खोज परिणाम [{1,0},{1,0}] , इसलिए यह खोज अतिरिक्त विकल्पों के साथ भी दोहराई जाती है।

ऑफसेट 1 पर [anchored, notempty_atstart]

वैकल्पिक ab पाया जाता है और परिणाम [{1,2}, {1,2}] है। परिणाम परिणामों की सूची में जोड़ा जाता है और खोज स्ट्रिंग में स्थिति दो चरणों में उन्नत होती है।

ऑफसेट 3

खोज एक बार फिर से रिक्त स्ट्रिंग से मेल खाती है, [{3,0},{3,0}]

ऑफसेट 1 पर [anchored, notempty_atstart]

इससे लंबाई> 0 का कोई परिणाम नहीं मिलता है और हम अंतिम स्थान पर हैं, इसलिए वैश्विक खोज पूरी हो गई है।

कॉल का परिणाम है:

{match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}
notempty

यदि इस विकल्प को निर्दिष्ट किया जाता है तो एक खाली स्ट्रिंग को एक वैध मिलान नहीं माना जाता है। यदि पैटर्न में विकल्प मौजूद हैं, तो उन्हें आजमाया जाता है। यदि सभी विकल्प खाली स्ट्रिंग से मेल खाते हैं, तो पूरा मैच विफल हो जाता है।

उदाहरण:

यदि निम्न पैटर्न "a" या "b" से शुरू नहीं होने वाले स्ट्रिंग पर लागू होता है, तो यह सामान्य रूप से विषय की शुरुआत में खाली स्ट्रिंग से मेल खाएगा:

a?b?

विकल्प notempty होने के साथ, यह मिलान अमान्य है, इसलिए "a" या "b" की घटनाओं के लिए स्ट्रिंग में आगे run/3 खोजें।

notempty_atstart

जैसे कि खाली नहीं है, सिवाय इसके कि एक खाली स्ट्रिंग मैच जो विषय की शुरुआत में नहीं है। यदि पैटर्न एंकर किया गया है, तो ऐसा मैच तभी हो सकता है जब पैटर्न में \ K हो।

पर्ल का कोई प्रत्यक्ष नहीं है, जो कि खाली या notempty_atstart बराबर है, लेकिन यह इसके विभाजन () फ़ंक्शन के भीतर खाली स्ट्रिंग के पैटर्न मैच का एक विशेष मामला बनाता है, और संशोधक /g का उपयोग करते समय। पर्ल का व्यवहार शून्य स्ट्रिंग से मिलान करने के बाद पहले से ही मैच को फिर से शुरू करने की कोशिश करता है, जो कि notempty_atstart और anchored साथ notempty_atstart , और फिर, यदि वह विफल रहता है, तो शुरुआती ऑफसेट को आगे बढ़ाकर (नीचे देखें) और फिर से एक साधारण मैच की कोशिश कर रहा है।

notbol

निर्दिष्ट करता है कि विषय स्ट्रिंग का पहला वर्ण एक पंक्ति की शुरुआत नहीं है, इसलिए इसके पहले से मेलफ्लेक्स मेटाचैकर का मिलान नहीं करना है। multiline (संकलन के समय) के बिना इसे सेट करने से खतना कभी भी मेल नहीं खाता। यह विकल्प केवल circumflex metacharacter के व्यवहार को प्रभावित करता है। यह \ A को प्रभावित नहीं करता है।

noteol

निर्दिष्ट करता है कि विषय स्ट्रिंग का अंत एक पंक्ति का अंत नहीं है, इसलिए डॉलर मेटाचैकर इसका मिलान नहीं करना है और न ही (मल्टीलाइन मोड को छोड़कर) इसके ठीक पहले एक नई पंक्ति। multiline (संकलन के समय) के बिना इसे सेट करने से डॉलर कभी मेल नहीं खाता है। यह विकल्प केवल डॉलर मेटाचैकर के व्यवहार को प्रभावित करता है। यह \ Z या \ z को प्रभावित नहीं करता है।

report_errors

run/3 में त्रुटि से निपटने का बेहतर नियंत्रण देता है। निर्दिष्ट होने पर, संकलन त्रुटियों (यदि नियमित अभिव्यक्ति पहले से ही संकलित नहीं है) और रनटाइम त्रुटियों को स्पष्ट रूप से एक त्रुटि के रूप में वापस किया जाता है।

निम्नलिखित रनटाइम त्रुटियाँ हैं:

match_limit

PCRE लाइब्रेरी एक सीमा निर्धारित करती है कि आंतरिक मिलान फ़ंक्शन को कितनी बार कहा जा सकता है। लाइब्रेरी में Erlang के लिए संकलित 10,000,000 तक की कमी। यदि {error, match_limit} वापस किया जाता है, तो नियमित अभिव्यक्ति का निष्पादन इस सीमा तक पहुंच गया है। इसे सामान्य रूप से एक nomatch माना जाता है, जो ऐसा होने पर डिफ़ॉल्ट रिटर्न मान होता है, लेकिन report_errors निर्दिष्ट report_errors , आपको सूचित किया जाता है जब बहुत अधिक आंतरिक कॉल के कारण मैच विफल हो जाता है।

match_limit_recursion

यह त्रुटि match_limit से बहुत मिलती- match_limit , लेकिन तब होती है जब PCRE का आंतरिक मैच फ़ंक्शन "recursively" होता है जिसे match_limit_recursion सीमा से अधिक बार कहा जाता है, जो 10,000,000 तक भी चूक करता है। ध्यान दें कि जब तक match_limit और match_limit_default मान डिफ़ॉल्ट मानों पर रखे जाते हैं, तब तक match_limit_recursion त्रुटि नहीं हो सकती है, क्योंकि इससे पहले match_limit त्रुटि होती है (प्रत्येक पुनरावर्ती कॉल भी एक कॉल है, लेकिन इसके विपरीत नहीं)। हालाँकि, दोनों सीमाओं को या तो नियमित अभिव्यक्ति स्ट्रिंग में सीधे सीमा निर्धारित करके (अनुभाग PCRE Regular Eexpression Details ) या run/3 लिए विकल्प निर्दिष्ट करके निर्धारित किया जा सकता है।

यह समझना महत्वपूर्ण है कि मैचों को सीमित करते समय "रिकर्सन" के रूप में जाना जाता है, एर्लांग मशीन के सी स्टैक या एर्लांग प्रक्रिया स्टैक पर पुनरावृत्ति नहीं है। पीसीएल संस्करण को एरलंग वीएम में संकलित किया गया है जो मूल्यों को संग्रहीत करने के लिए मशीन "हीप" मेमोरी का उपयोग करता है जिसे नियमित अभिव्यक्ति मैचों में पुनरावृत्ति पर रखा जाना चाहिए।

{match_limit, integer() >= 0}

कार्यान्वयन-विशिष्ट तरीके से मैच के निष्पादन का समय सीमित करता है। यह पीसीआरई प्रलेखन द्वारा निम्नानुसार वर्णित है:

The match_limit field provides a means of preventing PCRE from using
up a vast amount of resources when running patterns that are not going
to match, but which have a very large number of possibilities in their
search trees. The classic example is a pattern that uses nested
unlimited repeats.

Internally, pcre_exec() uses a function called match(), which it calls
repeatedly (sometimes recursively). The limit set by match_limit is
imposed on the number of times this function is called during a match,
which has the effect of limiting the amount of backtracking that can
take place. For patterns that are not anchored, the count restarts
from zero for each position in the subject string.

इसका मतलब यह है कि यदि इस विकल्प का उपयोग करके सीमा को कम किया जाता है तो भगोड़ा नियमित अभिव्यक्ति मैच तेजी से विफल हो सकता है। डिफ़ॉल्ट मान 10,000,000 को Erlang VM में संकलित किया गया है।

ध्यान दें

यह विकल्प किसी भी तरह से "लंबे समय तक चलने वाले बीआईएफ" के मामले में एर्लैंग वीएम के निष्पादन को प्रभावित नहीं करता है। run/3 हमेशा अंतराल पर Erlang प्रक्रियाओं के अनुसूचक को नियंत्रण देता है जो Erlang प्रणाली के वास्तविक समय के गुणों को सुनिश्चित करता है।

{match_limit_recursion, integer() >= 0}

कार्यान्वयन-विशिष्ट तरीके से एक मैच के निष्पादन समय और मेमोरी की खपत को match_limit करता है, बहुत कुछ match_limit समान। यह पीसीआरई प्रलेखन द्वारा निम्नानुसार वर्णित है:

The match_limit_recursion field is similar to match_limit, but instead
of limiting the total number of times that match() is called, it
limits the depth of recursion. The recursion depth is a smaller number
than the total number of calls, because not all calls to match() are
recursive. This limit is of use only if it is set smaller than
match_limit.

Limiting the recursion depth limits the amount of machine stack that
can be used, or, when PCRE has been compiled to use memory on the heap
instead of the stack, the amount of heap memory that can be used.

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

कम मूल्य निर्दिष्ट करने से गहरी पुनरावृत्ति विफल होने के साथ मैच हो सकते हैं, जब उन्हें मिलान होना चाहिए:

1> re:run("aaaaaaaaaaaaaz","(a+)*z").
{match,[{0,14},{0,13}]}
2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
nomatch
3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]).
{error,match_limit_recursion}

यह विकल्प और विकल्प match_limit केवल दुर्लभ मामलों में उपयोग किए जाने वाले हैं। इन सीमाओं के साथ छेड़छाड़ करने से पहले पीसीआरई लाइब्रेरी इंटर्नल की समझ की सिफारिश की जाती है।

{offset, integer() >= 0}

विषय स्ट्रिंग में निर्दिष्ट ऑफ़सेट (स्थिति) पर मिलान शुरू करें। ऑफ़सेट शून्य-आधारित है, ताकि डिफ़ॉल्ट {offset,0} (सभी विषय स्ट्रिंग) हो।

{newline, NLSpec}

विषय स्ट्रिंग में एक नई पंक्ति की डिफ़ॉल्ट परिभाषा को ओवरराइड करता है, जो कि एरलांग में एलएफ (एएससीआईआई 10) है।

cr

न्यूलाइन को एकल चरित्र CR (ASCII 13) द्वारा इंगित किया गया है।

lf

न्यूलाइन को एकल वर्ण LF (ASCII 10), डिफ़ॉल्ट द्वारा इंगित किया गया है।

crlf

न्यूलाइन को दो-वर्ण CRLF (ASCII 13 के बाद ASCII 10) अनुक्रम द्वारा दर्शाया गया है।

anycrlf

तीन पूर्ववर्ती अनुक्रमों में से किसी को मान्यता दी गई है।

any

ऊपर दी गई कोई भी नई अनुक्रमणिका, और यूनिकोड अनुक्रम VT (वर्टिकल टैब, U + 000B), FF (फॉर्मफीड, U + 000C), NEL (अगली पंक्ति, U + 0085), LS (लाइन विभाजक, U + 2028), और PS (पैराग्राफ सेपरेटर, U + 2029)।

bsr_anycrlf

विशेष रूप से निर्दिष्ट करता है कि \ R केवल CR LF, या CRLF क्रमों से मेल खाता है, न कि यूनिकोड-विशिष्ट न्यूलाइन वर्णों से। (संकलन विकल्प को ओवरराइड करता है।)

bsr_unicode

विशेष रूप से निर्दिष्ट करता है कि \ R सभी यूनिकोड न्यूलाइन वर्णों (CRLF सहित, और इसी तरह, डिफ़ॉल्ट पर) से मेल खाता है। (संकलन विकल्प को ओवरराइड करता है।)

{capture, ValueSpec} / {capture, ValueSpec, Type}

निर्दिष्ट करता है कि कैप्चर किए गए सब्सट्रिंग कौन से हैं और किस प्रारूप में हैं। डिफ़ॉल्ट रूप से, run/3 सबरिंग के सभी मिलान वाले भाग को कैप्चर करता है और सभी कैप्चरिंग सबपैटर्न (पैटर्न के सभी स्वचालित रूप से)। डिफ़ॉल्ट रिटर्न प्रकार स्ट्रिंग के कैप्चर किए गए भागों का (शून्य-आधारित) इंडेक्स है, जिसे {Offset,Length} जोड़े (कैप्चरिंग का index Type ) के रूप में निर्दिष्ट किया गया है।

डिफ़ॉल्ट व्यवहार के एक उदाहरण के रूप में, निम्न कॉल रिटर्न, पहले और केवल कैप्चर किए गए स्ट्रिंग के रूप में, विषय का मिलान भाग (बीच में "abcd") एक इंडेक्स जोड़ी {3,4} , जहां चरित्र स्थिति शून्य हैं- आधारित, ऑफ़सेट्स की तरह:

re:run("ABCabcdABC","abcd",[]).

इस कॉल का रिटर्न मान है:

{match,[{3,4}]}

एक और (और काफी सामान्य) मामला वह है जहां नियमित अभिव्यक्ति सभी विषय से मेल खाती है:

re:run("ABCabcdABC",".*abcd.*",[]).

यहाँ रिटर्न वैल्यू इसी प्रकार सभी स्ट्रिंग को इंगित करता है, जो कि इंडेक्स 0 पर शुरू होता है, और यह १० अक्षर लंबा है:

{match,[{0,10}]}

यदि नियमित अभिव्यक्ति में उपपट्टियों को कैप्चर करना शामिल है, जैसे:

re:run("ABCabcdABC",".*(abcd).*",[]).

मिलान किए गए विषय के सभी पर कब्जा कर लिया गया है, साथ ही साथ पकड़े गए सबस्ट्रिंग भी:

{match,[{0,10},{3,4}]}

पूर्ण मिलान पैटर्न हमेशा सूची में पहला रिटर्न मान देता है और शेष सबपैटर्न को उस क्रम में जोड़ा जाता है जो वे नियमित अभिव्यक्ति में हुए थे।

कैप्चर टपल का निर्माण निम्नानुसार किया गया है:

ValueSpec

निर्दिष्ट करता है कि कैप्चर किए गए (उप) पैटर्न वापस करने हैं। ValueSpec या तो वापसी मूल्यों के पूर्वनिर्धारित सेट का वर्णन करने वाला एक परमाणु हो सकता है, या एक सूची जिसमें अनुक्रमणिका या वापसी करने के लिए विशिष्ट उपपट्टों के नाम हो सकते हैं।

सबपैटर्न के पूर्वनिर्धारित सेट निम्नलिखित हैं:

all

सभी मिलान किए गए स्ट्रिंग सहित सबपैटर्न पर कब्जा कर लिया। यह डिफ़ॉल्ट है।

all_names

नियमित अभिव्यक्ति में सभी नामित सबपैटर्न, जैसे कि वर्णमाला क्रम में सभी नामों की एक list() निर्दिष्ट की गई थी। inspect/2 साथ सभी नामों की सूची भी प्राप्त की जा सकती है।

first

केवल पहला कैप्चर किया गया सबपैटर्न, जो हमेशा विषय का पूर्ण मिलान वाला भाग होता है। सभी स्पष्ट रूप से कैप्चर किए गए सबपैटर्न को छोड़ दिया गया है।

all_but_first

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

none

कोई भी मैचिंग सबपैटर्न नहीं देता है, {match, list()} रिटर्न के बजाय सफलतापूर्वक मिलान होने पर फ़ंक्शन के रिटर्न मूल्य के रूप में एकल परमाणु match देता है। खाली सूची निर्दिष्ट करने से समान व्यवहार होता है।

मान सूची उपपट्टनों के लिए अनुक्रमणिका की सूची है, जहां सूचकांक 0 पैटर्न के सभी के लिए है, और 1 नियमित अभिव्यक्ति में पहली स्पष्ट कैप्चरिंग उपपट्ट के लिए है, और इसी तरह। नियमित अभिव्यक्ति में नामित कैप्चर किए गए उपपट्टों (नीचे देखें) का उपयोग करते समय, उप-स्टॉर्न को निर्दिष्ट करने के लिए व्यक्ति atom() या string() का उपयोग कर सकता है। उदाहरण के लिए, नियमित अभिव्यक्ति पर विचार करें:

".*(abcd).*"

स्ट्रिंग "ABCabcdABC" के विरुद्ध मिलान किया गया, केवल "abcd" भाग (पहला स्पष्ट उपपट्ट) पर कब्जा:

re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

कॉल निम्न परिणाम देता है, क्योंकि पहले स्पष्ट रूप से कैप्चर किया गया उपपट्ट "है (abcd)", विषय में "abcd" से मेल खाता है, (शून्य-आधारित) स्थिति 3 पर, लंबाई 4:

{match,[{3,4}]}

उसी नियमित अभिव्यक्ति पर विचार करें, लेकिन उप-समूह के साथ स्पष्ट रूप से 'FOO' नाम दिया गया है:

".*(?<FOO>abcd).*"

इस अभिव्यक्ति के साथ, हम अभी भी निम्न कॉल के साथ उपपट्ट का सूचकांक दे सकते हैं:

re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

पहले जैसा परिणाम दे रहा है। लेकिन, जैसा कि उपपट्ट का नाम दिया गया है, हम मूल्य सूची में इसका नाम भी निर्दिष्ट कर सकते हैं:

re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

यह पहले के उदाहरणों के समान परिणाम देगा, अर्थात्:

{match,[{3,4}]}

मूल्यों की सूची अनुक्रमित या नामों को निर्दिष्ट कर सकती है जो नियमित अभिव्यक्ति में मौजूद नहीं हैं, इस मामले में प्रकार के आधार पर रिटर्न मान भिन्न होते हैं। यदि प्रकार index , तो टपल {-1,0} नियमित अभिव्यक्ति में कोई संगत उपपट्ट वाले मानों के लिए लौटा दी जाती है, लेकिन अन्य प्रकारों ( binary और list ) के लिए, मान क्रमशः खाली बाइनरी या सूची हैं।

Type

वैकल्पिक रूप से निर्दिष्ट करता है कि कैप्चर किए गए सब्सट्रिंग को कैसे लौटाया जाना है। यदि छोड़ा गया है, तो index का डिफ़ॉल्ट उपयोग किया जाता है।

Type निम्न में से एक हो सकता है:

index

विषय स्ट्रिंग और बाइट इंडेक्स के जोड़े के रूप में सब्स्टीट्यूशन को कैप्चर किए गए रिटर्न में सब्जेक्ट स्ट्रिंग और लंबाई में मिलान स्ट्रिंग की लंबाई (जैसे कि विषय स्ट्रिंग erlang:iolist_to_binary/1 साथ चपटा था erlang:iolist_to_binary/1 या unicode:characters_to_binary/2 erlang:iolist_to_binary/1 unicode:characters_to_binary/2 मिलान से पहले)। ध्यान दें कि विकल्प unicode परिणाम बाइट-ओरिएंटेड इंडेक्स में (संभवतः आभासी) UTF-8 एन्कोडेड बाइनरी है। एक बाइट इंडेक्स टपल {0,2} इसलिए unicode प्रभावी होने पर एक या दो वर्णों का प्रतिनिधित्व कर सकता है। यह काउंटर-सहज ज्ञान युक्त लग सकता है, लेकिन इसे करने का सबसे प्रभावी और उपयोगी तरीका माना गया है। इसके बजाय सूचियों को वापस करने के लिए सरल कोड में परिणाम कर सकते हैं यदि वह वांछित है। यह वापसी प्रकार डिफ़ॉल्ट है।

list

वर्णों की सूची के रूप में मिलान वाले पदार्थों को लौटाता है (एरलैंग string() ))। यह विकल्प unicode का उपयोग नियमित अभिव्यक्ति में \ C अनुक्रम के साथ संयोजन में किया जाता है, एक कैप्चर किए गए उपपट्ट में बाइट्स हो सकते हैं जो मान्य UTF-8 (वर्ण मिलान की परवाह किए बिना बाइट्स से मेल खाते हैं)। उस स्थिति में कैप्चरिंग की list में उसी प्रकार के ट्यूपल्स हो सकते हैं जो unicode:characters_to_list/2 वापस आ सकते हैं, अर्थात् टैग incomplete या error साथ तीन-ट्यूपल, सफलतापूर्वक परिवर्तित वर्ण और रूपांतरण के अमान्य UTF-8 टेल बाइनरी के रूप में । सूचियों को कैप्चर करते समय \ _ अनुक्रम का उपयोग करने से बचने के लिए सबसे अच्छी रणनीति है।

binary

बायनेरिज़ के रूप में मैचिंग सब्सट्रिंग्स लौटाता है। यदि विकल्प unicode का उपयोग किया जाता है, तो ये बायनेरिज़ UTF-8 में हैं। यदि unicode साथ \ C अनुक्रम का उपयोग किया जाता है, तो बायनेरिज़ को UTF-8 अमान्य किया जा सकता है।

सामान्य तौर पर, मैच में एक मान असाइन नहीं किए गए सबपैटर्न को type index होने पर टपल {-1,0} रूप में वापस किया जाता है। अन्य रिटर्न प्रकारों के लिए, अनअसाइन्ड सबपैटर्न को क्रमशः खाली बाइनरी या सूची के रूप में लौटाया जाता है। निम्नलिखित नियमित अभिव्यक्ति पर विचार करें:

".*((?<FOO>abdd)|a(..d)).*"

तीन स्पष्ट रूप से कैप्चरिंग उपपट्टियाँ होती हैं, जहाँ ओपनिंग कोष्ठक स्थिति परिणाम में क्रम को निर्धारित करती है, इसलिए ((?<FOO>abdd)|a(..d)) उपपट्ट इंडेक्स 1 है, (?<FOO>abdd) उपपट्ट सूचकांक 2, और (..d) उपपट्ट सूचकांक है 3. जब निम्नलिखित स्ट्रिंग के खिलाफ मिलान किया जाता है:

"ABCabcdABC"

अनुक्रमणिका 2 में उपपट्ट मेल नहीं खाता है, क्योंकि स्ट्रिंग में "एबीडी" मौजूद नहीं है, लेकिन पूरा पैटर्न मेल खाता है (क्योंकि वैकल्पिक a(..d) )। अनुक्रमणिका 2 में उपपट्ट इसलिए अप्रकाशित है और डिफ़ॉल्ट रिटर्न मान है:

{match,[{0,10},{3,4},{-1,0},{4,3}]}

कैप्चर Type को binary सेट करना देता है:

{match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

यहाँ खाली बाइनरी ( <<>> ) अनसाइन्टेड सबपैटर्न का प्रतिनिधित्व करता है। binary मामले में, मिलान के बारे में कुछ जानकारी इसलिए खो जाती है, क्योंकि <<>> एक खाली स्ट्रिंग भी हो सकती है।

यदि खाली मैचों और गैर-मौजूदा उप-श्रेणियों के बीच भेदभाव आवश्यक है, तो type index उपयोग करें और Erlang कोड में अंतिम प्रकार में रूपांतरण करें।

जब विकल्प global निर्दिष्ट किया जाता है, तो capture विनिर्देश प्रत्येक मैच को अलग से प्रभावित करता है, ताकि:

re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

देता है

{match,[["a"],["b"]]}

केवल संकलन चरण को प्रभावित करने वाले विकल्पों के विवरण के लिए, compile/2

विभाजन (विषय, आरई) -> स्प्लिटलिस्ट

प्रकार

split(Subject, RE, []) रूप में भी split(Subject, RE, [])

विभाजन (विषय, आरई, विकल्प) -> स्प्लिटलिस्ट

प्रकार

compile/2 देखें।

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

जैसा कि run/3 , mp() विकल्प के साथ संकलित करने के लिए यूनिकोड होना unicode आवश्यक Subject है charlist() । यदि संकलन अंतर्निहित रूप से किया जाता है और unicode संकलन विकल्प इस फ़ंक्शन के लिए निर्दिष्ट किया जाता है, तो दोनों नियमित अभिव्यक्ति और Subject मान्य यूनिकोड charlist() s के रूप में निर्दिष्ट किए जाने चाहिए ।

परिणाम "स्ट्रिंग्स" की सूची के रूप में दिया गया है, विकल्प return (डिफ़ॉल्ट iodata ) में निर्दिष्ट पसंदीदा डेटा प्रकार ।

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

re:split("Erlang","[ln]",[{return,list}]).

देता है

["Er","a","g"]

जबकि

re:split("Erlang","([ln])",[{return,list}]).

देता है

["Er","l","a","n","g"]

सब-एक्प्रेशन (नियमित अभिव्यक्ति में कोष्ठकों द्वारा चिह्नित) से मेल खाते पाठ को परिणाम सूची में डाला जाता है जहां यह पाया गया था। इसका मतलब यह है कि एक विभाजन के परिणाम को पूरा करने के लिए जहां पूरी नियमित अभिव्यक्ति एक एकल सबडिप्रेशन है (जैसा कि पिछले उदाहरण में) हमेशा मूल स्ट्रिंग में परिणाम होता है।

जैसे कि उदाहरण ("जी") में अंतिम भाग के लिए कोई मेल नहीं है, उसके बाद कुछ भी नहीं डाला जाता है। तार के समूह और उप- group वर्गों के मिलान वाले भागों को अधिक स्पष्ट बनाने के लिए, कोई भी विकल्प का उपयोग कर सकता है , जो समूह एक साथ विषय स्ट्रिंग के हिस्से को उप-खंडों के मिलान वाले भागों के साथ जोड़ते हैं जब स्ट्रिंग विभाजित होती थी:

re:split("Erlang","([ln])",[{return,list},group]).

देता है

[["Er","l"],["a","n"],["g"]]

यहां नियमित अभिव्यक्ति ने पहले "एल" का मिलान किया, जिससे "एर" परिणाम में पहले भाग में आ गया। जब नियमित अभिव्यक्ति का मिलान होता है, तो (केवल) उपसंचाई "l" के लिए बाध्य होती है, इसलिए समूह में "Er" के साथ "l" डाला जाता है। अगला मैच "n" का है, जिससे "a" अगला भाग होगा। जैसा कि इस मामले में "एन" को प्रतिस्थापित करने के लिए बाध्य है, इस समूह में "एन" डाला जाता है। अंतिम समूह में शेष स्ट्रिंग शामिल हैं, क्योंकि कोई और मैच नहीं मिला है।

डिफ़ॉल्ट रूप से, स्ट्रिंग के सभी भाग, खाली तारों सहित, फ़ंक्शन से वापस आ जाते हैं, उदाहरण के लिए:

re:split("Erlang","[lg]",[{return,list}]).

देता है

["Er","an",[]]

स्ट्रिंग के अंत में "जी" के मिलान के रूप में एक खाली आराम छोड़ देता है, जिसे वापस भी किया जाता है। यह व्यवहार पर्ल में विभाजित फ़ंक्शन के डिफ़ॉल्ट व्यवहार से भिन्न होता है, जहां अंत में खाली तार डिफ़ॉल्ट रूप से हटा दिए जाते हैं। पर्ल के "ट्रिमिंग" डिफ़ॉल्ट व्यवहार को प्राप्त करने के लिए, trim एक विकल्प के रूप में निर्दिष्ट करें :

re:split("Erlang","[lg]",[{return,list},trim]).

देता है

["Er","an"]

"ट्रिम" विकल्प कहता है; "मुझे खाली हिस्सों को छोड़कर यथासंभव भाग दें", जो कभी-कभी उपयोगी हो सकते हैं। आप यह भी निर्दिष्ट कर सकते हैं कि {parts, N को निर्दिष्ट करके आप कितने भाग चाहते हैं } :

re:split("Erlang","[lg]",[{return,list},{parts,2}]).

देता है

["Er","ang"]

ध्यान दें कि अंतिम भाग "एंगल" है, न कि "ए", क्योंकि बंटवारे को दो भागों में निर्दिष्ट किया गया था, और बंटवारा रुक जाता है जब पर्याप्त भाग दिए जाते हैं, यही वजह है कि इसका परिणाम भिन्न होता है trim

इस इंडेट के साथ तीन से अधिक हिस्से संभव नहीं हैं, इसलिए

re:split("Erlang","[lg]",[{return,list},{parts,4}]).

डिफ़ॉल्ट के समान परिणाम देता है, जिसे "भागों की एक अनंत संख्या" के रूप में देखा जाना है।

0 भागों की संख्या के रूप में निर्दिष्ट करना विकल्प के समान प्रभाव देता है trim । यदि सबएक्सप्रेस को कैप्चर किया जाता है, तो अंत में मिलान किए गए खाली सबएक्सप्रेस को भी परिणाम से छीन लिया जाता है यदि trim या {parts,0} निर्दिष्ट किया गया हो।

trim व्यवहार बिल्कुल पर्ल डिफ़ॉल्ट से मेल खाती है। {parts,N} , जहां एन एक सकारात्मक पूर्णांक है, एक सकारात्मक संख्यात्मक तीसरे पैरामीटर के साथ पर्ल व्यवहार से बिल्कुल मेल खाता है। split/3 जब एक नकारात्मक पूर्णांक को पर्ल रूटीन के लिए तीसरे पैरामीटर के रूप में निर्दिष्ट किया जाता है, तो पर्ल व्यवहार से मेल खाता डिफ़ॉल्ट व्यवहार ।

फ़ंक्शन के लिए पहले वर्णित नहीं विकल्पों का सारांश run/3 :

{return,ReturnType}

यह निर्दिष्ट करता है कि परिणाम सूची में मूल स्ट्रिंग के भागों को कैसे प्रस्तुत किया गया है। मान्य प्रकार:

iodata

उस का संस्करण iodata() वर्तमान कार्यान्वयन के साथ डेटा की कम से कम प्रतिलिपि देता है (अक्सर एक बाइनरी, लेकिन इस पर निर्भर नहीं होता है)।

binary

सभी भाग बायनेरिज़ के रूप में वापस आ गए।

list

सभी भाग पात्रों की सूची ("स्ट्रिंग्स") के रूप में वापस आ गए।

group

समूह स्ट्रिंग के हिस्सों को एक साथ जोड़कर नियमित अभिव्यक्ति के उप-वर्गों से मेल खाते हैं।

फ़ंक्शन से वापसी मान इस मामले में list() है list() । प्रत्येक सबलिस्ट की शुरुआत स्ट्रिंग से होती है, जो विषय स्ट्रिंग से बाहर निकाली जाती है, इसके बाद नियमित अभिव्यक्ति में होने वाले क्रम में प्रत्येक सबएक्सप्रेस के मिलान वाले भाग होते हैं।

{parts,N}

निर्दिष्ट करता है कि विषय स्ट्रिंग को कितने भागों में विभाजित किया जाना है।

भागों की संख्या एक विशिष्ट अधिकतम भागों के लिए एक सकारात्मक पूर्णांक होना है, और infinity अधिकतम संभव भागों की संख्या (डिफ़ॉल्ट) के लिए है। निर्दिष्ट {parts,0} करने के अंत में खाली भागों की अवहेलना के रूप में कई भागों के रूप में देता है, निर्दिष्ट करने के रूप में ही trim

trim

निर्दिष्ट करता है कि परिणाम सूची के अंत में खाली भागों की अवहेलना की जानी है। निर्दिष्ट करने के समान {parts,0} । यह split पर्ल में अंतर्निहित फ़ंक्शन के डिफ़ॉल्ट व्यवहार से मेल खाती है ।

पर्ल-लाइक रेगुलर एक्सप्रेशन सिंटेक्स

इस मॉड्यूल द्वारा उपयोग किए जाने वाले नियमित अभिव्यक्तियों के लिए निम्न अनुभागों में संदर्भ सामग्री है। जानकारी PCRE दस्तावेज़ पर आधारित है, जिसमें परिवर्तन के साथ जहां यह मॉड्यूल PCRE लाइब्रेरी के लिए भिन्न व्यवहार करता है।

पीसीआरई नियमित अभिव्यक्ति विवरण

पीसीआरई द्वारा समर्थित नियमित अभिव्यक्तियों के वाक्यविन्यास और शब्दार्थ को निम्नलिखित वर्गों में विस्तार से वर्णित किया गया है। पर्ल के नियमित भावों को उसके स्वयं के प्रलेखन में वर्णित किया गया है, और सामान्य रूप से नियमित अभिव्यक्ति कई पुस्तकों में शामिल हैं, कुछ प्रचुर उदाहरणों के साथ। ओ'रेली द्वारा प्रकाशित जेफरी फ्रीडल की "मास्टेरिंग रेगुलर एक्सप्रेशंस" में नियमित अभिव्यक्तियों को काफी विस्तार से शामिल किया गया है। पीसीआरई नियमित अभिव्यक्तियों का यह विवरण संदर्भ सामग्री के रूप में अभिप्रेत है।

संदर्भ सामग्री को निम्न वर्गों में विभाजित किया गया है:

विशेष स्टार्ट-ऑफ-पैटर्न आइटम

कुछ विकल्प जो पारित किए जा compile/2 सकते हैं, उन्हें पैटर्न की शुरुआत में विशेष वस्तुओं द्वारा भी सेट किया जा सकता है। ये पर्ल-संगत नहीं हैं, लेकिन इन विकल्पों को पैटर्न लेखकों के लिए सुलभ बनाने के लिए प्रदान किया जाता है जो पैटर्न को संसाधित करने वाले प्रोग्राम को बदलने में सक्षम नहीं हैं। इन मदों में से कोई भी संख्या दिखाई दे सकती है, लेकिन पैटर्न स्ट्रिंग की शुरुआत में वे सभी एक साथ सही होने चाहिए, और अक्षर ऊपरी स्थिति में होने चाहिए।

UTF समर्थन

यूनिकोड समर्थन मूल रूप से UTF-8 आधारित है। यूनिकोड वर्णों का उपयोग करने के लिए, आप या तो कॉल करते हैं compile/2 या run/3 विकल्प के साथ unicode , या पैटर्न को इनमें से किसी एक विशेष क्रम से शुरू करना चाहिए:

(*UTF8)
(*UTF)

दोनों विकल्प समान प्रभाव देते हैं, इनपुट स्ट्रिंग की व्याख्या UTF-8 के रूप में की जाती है। ध्यान दें कि इन निर्देशों के साथ, यूटीएफ -8 को सूचियों का स्वचालित रूपांतरण re कार्यों द्वारा निष्पादित नहीं किया जाता है । इसलिए, इन दृश्यों का उपयोग करने की अनुशंसा नहीं की जाती है। इसके बजाय unicode चलाते समय विकल्प जोड़ें compile/2

कुछ एप्लिकेशन जो अपने उपयोगकर्ताओं को पैटर्न की आपूर्ति करने की अनुमति देते हैं, उन्हें सुरक्षा कारणों से गैर-यूटीएफ डेटा तक सीमित करना चाहते हैं। यदि विकल्प never_utf संकलन समय पर सेट किया गया है, (* UTF), और इसी तरह, अनुमति नहीं है, और उनकी उपस्थिति में त्रुटि होती है।

यूनिकोड संपत्ति का समर्थन

निम्नलिखित एक और विशेष अनुक्रम है जो एक पैटर्न की शुरुआत में दिखाई दे सकता है:

(*UCP)

सेटिंग विकल्प के रूप में इसका एक ही प्रभाव है ucp : यह वर्ण प्रकार निर्धारित करने के लिए यूनिकोड गुणों का उपयोग करने के लिए \ d और \ w जैसे अनुक्रम का कारण बनता है, बजाय कोड लुकअप तालिका के माध्यम से कोड <256 के साथ केवल वर्णों को पहचानने के लिए।

स्टार्टअप ऑप्टिमाइज़ेशन अक्षम करना

यदि एक पैटर्न के साथ शुरू होता है (*NO_START_OPT) , तो इसका no_start_optimize संकलन समय पर विकल्प सेट करने के समान प्रभाव पड़ता है ।

न्यूलाइन कन्वेंशन

PCRE स्ट्रिंग्स में लाइन ब्रेक का संकेत देने के लिए पांच सम्मेलनों का समर्थन करता है: एक एकल CR (गाड़ी वापसी) चरित्र, एक एकल LF (लाइन फीड) चरित्र, दो-वर्ण अनुक्रम CRLF, तीन पूर्ववर्ती में से कोई भी, और कोई भी यूनीकोड ​​न्यूलाइन अनुक्रम।

निम्नलिखित पाँच अनुक्रमों में से एक के साथ एक पैटर्न स्ट्रिंग शुरू करके एक नया सम्मेलन भी निर्दिष्ट किया जा सकता है:

(* सीआर)
कैरिज रिटर्न
(* वामो)
रेखा भरण
(* CRLF)
> लाइन फीड के बाद कैरिज रिटर्न
(* ANYCRLF)
उपरोक्त तीनों में से कोई भी
(*कोई भी)
सभी यूनिकोड न्यूलाइन अनुक्रम

ये डिफ़ॉल्ट और निर्दिष्ट विकल्पों को ओवरराइड करते हैं compile/2 । उदाहरण के लिए, निम्न पैटर्न सीआर के लिए कन्वेंशन को बदलता है:

(*CR)a.b

यह पैटर्न मेल खाता है a\nb , क्योंकि LF अब कोई नई रेखा नहीं है। यदि उनमें से एक से अधिक मौजूद है, तो अंतिम एक का उपयोग किया जाता है।

न्यूलाइन कन्वेंशन को प्रभावित करता है, जहां circumflex और डॉलर के दावे सही हैं। यह dotall सेट नहीं होने पर डॉट मेटाचैकर की व्याख्या और \ N के व्यवहार को भी प्रभावित करता है । हालाँकि, यह प्रभावित नहीं करता है कि \ R एस्केप अनुक्रम मैच क्या है। डिफ़ॉल्ट रूप से, यह पर्ल संगतता के लिए कोई भी यूनिकोड न्यूलाइन अनुक्रम है। हालाँकि, इसे बदला जा सकता है; अनुभाग में \ R का वर्णन देखें Newline Sequences । \ R सेटिंग का एक परिवर्तन न्यूलाइन कन्वेंशन के एक बदलाव के साथ जोड़ा जा सकता है।

मैच और पुनरावृत्ति सीमा निर्धारित करना

के फोन करने वाले run/3 बार आंतरिक मैच () फ़ंक्शन कहा जाता है की संख्या पर और पुनरावर्ती कॉल की अधिकतम अवधि को सीमित कर सकते हैं। ये सुविधाएं रनवे मैच को पकड़ने के लिए प्रदान की जाती हैं जो विशाल मिलान वाले पेड़ों के साथ पैटर्न द्वारा उकसाया जाता है (एक विशिष्ट उदाहरण नेस्टेड असीमित दोहराव के साथ एक पैटर्न है) और बहुत अधिक पुनरावृत्ति से सिस्टम स्टैक से बाहर निकलने से बचने के लिए। जब इनमें से एक सीमा समाप्त हो जाती है, तो pcre_exec() एक त्रुटि रिटर्न देता है। निम्न रूपों के पैटर्न की शुरुआत में आइटम द्वारा सीमाएं भी निर्धारित की जा सकती हैं:

(*LIMIT_MATCH=d)
(*LIMIT_RECURSION=d)

यहाँ d किसी भी संख्या में दशमलव अंक है। हालाँकि, सेटिंग का मान run/3 किसी भी प्रभाव के लिए इसके कॉलर द्वारा निर्धारित मूल्य से कम होना चाहिए । यही है, पैटर्न लेखक प्रोग्रामर द्वारा निर्धारित सीमा को कम कर सकता है, लेकिन इसे बढ़ा नहीं सकता। यदि इन सीमाओं में से एक की एक से अधिक सेटिंग है, तो कम मूल्य का उपयोग किया जाता है।

Erlang VM में दोनों सीमाओं के लिए डिफ़ॉल्ट मान 10,000,000 है। ध्यान दें कि पुनरावर्तन सीमा वीएम की स्टैक गहराई को प्रभावित नहीं करती है, क्योंकि पीसीआर के लिए एरलैंग को इस तरह से संकलित किया गया है कि मैच फ़ंक्शन कभी भी सी स्टैक पर पुनरावृत्ति नहीं करता है।

ध्यान दें कि LIMIT_MATCH और LIMIT_RECURSION केवल कॉलर द्वारा निर्धारित सीमाओं के मूल्य को कम कर सकते हैं, उन्हें बढ़ाएं नहीं।

वर्ण और मेटाचैकर

एक नियमित अभिव्यक्ति एक पैटर्न है जो विषय स्ट्रिंग के खिलाफ बाएं से दाएं से मेल खाता है। अधिकांश पात्र एक पैटर्न में खुद के लिए खड़े होते हैं और विषय में संबंधित वर्णों से मेल खाते हैं। एक तुच्छ उदाहरण के रूप में, निम्न पैटर्न एक विषय स्ट्रिंग के एक भाग से मेल खाता है जो खुद के लिए समान है:

The quick brown fox

जब लापरवाह मिलान निर्दिष्ट किया जाता है (विकल्प caseless ), अक्षरों को मामले के स्वतंत्र रूप से मिलान किया जाता है।

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

मेटाचैकर के दो सेट मौजूद हैं: जिन्हें वर्ग ब्रैकेट के भीतर पैटर्न में कहीं भी पहचाना जाता है, और जिन्हें स्क्वायर ब्रैकेट में मान्यता प्राप्त है। वर्ग कोष्ठक के बाहर, मेटाचैकर इस प्रकार हैं:

\
कई उपयोगों के साथ सामान्य बच चरित्र
^
स्ट्रिंग की शुरुआत (या लाइन, मल्टीलाइन मोड में)
$
स्ट्रिंग का अंत (या लाइन, मल्टीलाइन मोड में)
न्यूलाइन को छोड़कर किसी भी वर्ण से मेल करें (डिफ़ॉल्ट रूप से)
[
चरित्र वर्ग परिभाषा शुरू करें
|
वैकल्पिक शाखा की शुरुआत
(
सबपाटन शुरू करें
)
अंत उपपाठ
?
एक, 0 या 1 क्वांटिफायर का अर्थ भी बढ़ाता है, क्वांटिफायर मिनिमाइज़र भी
*
0 या अधिक मात्रा में
+
1 या अधिक क्वांटिफायर
{
न्यूनतम / अधिकतम मात्रा प्रारंभ करें

चौकोर कोष्ठक के भीतर एक पैटर्न के भाग को "वर्ण वर्ग" कहा जाता है। एक चरित्र वर्ग में केवल मेटाचैकर्स निम्नलिखित हैं:

\
सामान्य बच चरित्र
^
कक्षा को नेगेट करें, लेकिन केवल अगर पहला चरित्र
-
चरित्र श्रेणी इंगित करता है
[
पॉज़िक्स वर्ण वर्ग (केवल यदि पॉज़िक्स सिंटैक्स द्वारा अनुसरण किया जाता है)
]
चरित्र वर्ग को निर्देशित करता है

निम्नलिखित खंड प्रत्येक मेटाचैकर के उपयोग का वर्णन करते हैं।

बैकस्लैश

बैकलैश कैरेक्टर के कई उपयोग हैं। सबसे पहले, यदि यह एक वर्ण द्वारा पीछा किया जाता है जो एक संख्या या एक अक्षर नहीं है, तो यह किसी भी विशेष अर्थ को हटा देता है जो एक चरित्र हो सकता है। पलायन चरित्र के रूप में बैकस्लैश का यह प्रयोग चरित्र वर्ग के अंदर और बाहर दोनों पर लागू होता है।

उदाहरण के लिए, यदि आप एक * चरित्र से मेल खाना चाहते हैं, तो आप पैटर्न में \ * लिखते हैं। यह भागने की कार्रवाई तब लागू होती है यदि निम्न चरित्र को अन्यथा मेटाचैकर के रूप में व्याख्या किया जाता है, इसलिए बैकस्लैश के साथ गैर-अल्फ़ान्यूमेरिक से पहले यह हमेशा सुरक्षित है कि यह निर्दिष्ट करें कि यह स्वयं के लिए खड़ा है। विशेष रूप से, यदि आप बैकस्लैश का मिलान करना चाहते हैं, तो \\ लिखें।

में unicode मोड, केवल ASCII संख्या और अक्षरों में बैकस्लैश के बाद किसी भी विशेष अर्थ नहीं होता। अन्य सभी वर्ण (विशेष रूप से, जिनके कोड अंक> 127 हैं) को शाब्दिक माना जाता है।

यदि एक पैटर्न विकल्प के साथ संकलित किया जाता है extended , तो पैटर्न में व्हॉट्सएप (एक चरित्र वर्ग के अलावा) और एक चरित्र वर्ग के बाहर # के बीच के अक्षर और अगली नई रेखा को अनदेखा किया जाता है। एक भागने बैकस्लैश का उपयोग पैटर्न के भाग के रूप में एक व्हाट्सएप या # चरित्र को शामिल करने के लिए किया जा सकता है।

वर्णों के अनुक्रम से विशेष अर्थ निकालने के लिए, उन्हें \ Q और \ E के बीच रखें। यह उस $ में पर्ल से भिन्न है और $ PC में @ को शाब्दिक के रूप में नियंत्रित किया जाता है, जबकि PC में $ @ और कारण चर प्रक्षेपित होते हैं। निम्नलिखित उदाहरण देखें:

Pattern            PCRE matches   Perl matches

\Qabc$xyz\E        abc$xyz        abc followed by the contents of $xyz
\Qabc\$xyz\E       abc\$xyz       abc\$xyz
\Qabc\E\$\Qxyz\E   abc$xyz        abc$xyz

\ Q ... \ E अनुक्रम को वर्ण वर्ग के अंदर और बाहर दोनों से पहचाना जाता है। एक पृथक \ E जो कि \ Q से पहले नहीं होता है उसे अनदेखा किया जाता है। यदि बाद में पैटर्न में \ Q का पालन नहीं किया जाता है, तो पैटर्न के अंत में शाब्दिक व्याख्या जारी रहती है (अर्थात, अंत में \ E मान लिया जाता है)। यदि अलग-अलग \ Q वर्ण वर्ग के अंदर है, तो यह त्रुटि का कारण बनता है, क्योंकि वर्ण वर्ग समाप्त नहीं होता है।

गैर-मुद्रण वर्ण

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

\ए
अलार्म, वह है, बीईएल चरित्र (हेक्स 07)
\ cx
"नियंत्रण-एक्स", जहां x कोई भी ASCII वर्ण है
\ ई
पलायन (हेक्स 1 बी)
\ च
फॉर्म फ़ीड (हेक्स 0 सी)
\ n
लाइन फीड (हेक्स 0 ए)
\ r
गाड़ी वापसी (हेक्स 0 डी)
\ t
टैब (हेक्स 09)
\ 0dd
अष्टक कोड के साथ वर्ण 0dd
\ ddd
ऑक्टल कोड ddd, या बैक रेफरेंस के साथ कैरेक्टर
\ O {ddd ..}
अष्टकोणीय कोड के साथ चरित्र ddd ..
\ xhh
हेक्स कोड hh के साथ चरित्र
\ X {hhh ..}
हेक्स कोड के साथ चरित्र hhh ।।
ध्यान दें

ध्यान दें कि \ 0dd हमेशा एक ऑक्टल कोड होता है, और यह \ 8 और \ 9 शाब्दिक वर्ण "8" और "9" हैं।

ASCII वर्णों पर \ cx का सटीक प्रभाव निम्नानुसार है: यदि x एक लोअरकेस अक्षर है, तो इसे ऊपरी स्थिति में बदल दिया जाता है। फिर चरित्र के 6 बिट (हेक्स 40) उलटा है। इस प्रकार \ cA to \ cZ हेक्स 01 से हेक्स 1 ए (ए 41 है, जेड 5 ए है), लेकिन \ सी {हेक्स 3 बी ({7 बी), और \ सी हो जाता है; 7x हेक्स बन जाता है (; 3B है)। यदि डेटा आइटम (बाइट या 16-बिट मान) के बाद \ c का मान> 127 है, तो संकलन-समय त्रुटि उत्पन्न होती है। यह सभी मोड में गैर-ASCII वर्णों को लॉक करता है।

ASCII वर्णों के साथ उपयोग के लिए the \ c सुविधा डिज़ाइन की गई थी, लेकिन यूनिकोड के विस्तार के साथ यह एक बार की तुलना में भी कम उपयोगी नहीं था।

आगे के दो अंकों तक \ 0 के बाद पढ़ा जाता है। यदि दो से कम अंक हैं, तो जो मौजूद हैं उनका उपयोग किया जाता है। इस प्रकार अनुक्रम \ 0 \ x \ 015 दो द्विआधारी शून्य निर्दिष्ट करता है जिसके बाद एक सीआर वर्ण (कोड मान 13) होता है। सुनिश्चित करें कि आप प्रारंभिक शून्य के बाद दो अंकों की आपूर्ति करते हैं यदि पैटर्न वर्ण जो निम्नानुसार है वह स्वयं एक अष्टाधारी अंक है।

ब्रेक में संलग्न ऑक्टल अंकों के अनुक्रम के बाद एस्केप \ o का पालन करना चाहिए। यदि ऐसा नहीं होता है तो एक त्रुटि होती है। यह पलायन पर्ल का एक हालिया जोड़ है; यह वर्ण कोड बिंदुओं को 0777 से अधिक अष्टक संख्याओं के रूप में निर्दिष्ट करने का तरीका प्रदान करता है, और यह अष्टक संख्याओं और पीछे के संदर्भों को स्पष्ट रूप से निर्दिष्ट करने की अनुमति देता है।

अधिक स्पष्टता और स्पष्टता के लिए, शून्य से अधिक अंकों के बाद निम्नलिखित से बचना सबसे अच्छा है। इसके बजाय, वर्ण संख्या निर्दिष्ट करने के लिए \ o {} या \ x {} का उपयोग करें, और वापस संदर्भ निर्दिष्ट करने के लिए \ g {}। निम्नलिखित पैराग्राफ पुराने, अस्पष्ट वाक्यविन्यास का वर्णन करते हैं।

0 के अलावा एक अंक के बाद एक बैकस्लैश की हैंडलिंग जटिल है, और पर्ल हाल के रिलीज में बदल गया है, जिससे पीसीआरई भी बदल सकता है। एक वर्ण वर्ग के बाहर, PCRE अंक और निम्नलिखित अंकों को दशमलव संख्या के रूप में पढ़ता है। यदि संख्या <8 है, या यदि कम से कम यह है कि कई पिछले कैप्चरिंग कोष्ठकों को अभिव्यक्ति में छोड़ दिया गया है, तो पूरे अनुक्रम को वापस संदर्भ के रूप में लिया जाता है । यह जानकारी दी गई है कि किस प्रकार यह कार्य बाद में प्रदान किया गया है, जो कि लघुकोष्ठकृत उपपात्रों की चर्चा के बाद दिया गया है।

किसी वर्ण वर्ग के अंदर, या अगर दशमलव संख्या \ _> 7 है और वहाँ नहीं है कि कई कैप्चरिंग सबपैटर्न, PCRE 8 और \ 9 को शाब्दिक वर्ण "8" और "9" के रूप में संभालता है, और अन्यथा फिर से पढ़ता है बैकस्लैश के बाद तीन ऑक्टल अंक, और डेटा चरित्र उत्पन्न करने के लिए उनका उपयोग करना। किसी भी बाद के अंक अपने लिए खड़े होते हैं। उदाहरण के लिए:

\ 040
ASCII स्पेस लिखने का दूसरा तरीका
\ 40
वही, बशर्ते <40 पिछले कैप्चरिंग सबपैटर्न हैं
\ 7
हमेशा एक बैक रेफरेंस
\1 1
एक बैक रेफरेंस या टैब लिखने का दूसरा तरीका हो सकता है
\ 011
हमेशा एक टैब
\ 0113
चरित्र "3" के बाद एक टैब
\ 113
एक बैक रेफरेंस हो सकता है, अन्यथा ऑक्टल कोड 113 वाला चरित्र
\ 377
वापस संदर्भ हो सकता है, अन्यथा 255 (दशमलव) मान
\ 81
या तो एक पिछला संदर्भ, या दो अक्षर "8" और "1"

ध्यान दें कि अष्टक मूल्य> = 100 जो इस वाक्यविन्यास का उपयोग करके निर्दिष्ट किए गए हैं उन्हें एक अग्रणी शून्य द्वारा पेश नहीं किया जाना चाहिए, क्योंकि तीन से अधिक अष्टक अंक कभी नहीं पढ़े जाते हैं।

डिफ़ॉल्ट रूप से, \ x के बाद {द्वारा पीछा नहीं किया जाता है, शून्य से दो हेक्साडेसिमल अंकों को पढ़ा जाता है (पत्र ऊपरी या निचले मामले में हो सकते हैं)। हेक्साडेसिमल अंकों की कोई भी संख्या \ x {और} के बीच दिखाई दे सकती है। यदि हेक्साडेसिमल अंक के अलावा कोई वर्ण \ x {और} के बीच प्रकट होता है, या यदि कोई समाप्ति नहीं है}, तो एक त्रुटि होती है।

ऐसे वर्ण जिनका मान 256 से कम है, उन्हें \ x के लिए दो सिंटैक्स में से किसी एक द्वारा परिभाषित किया जा सकता है। उनके हाथ लगने के तरीके में कोई अंतर नहीं है। उदाहरण के लिए, \ xdc बिल्कुल \ x {dc} के समान है।

चरित्र मूल्यों पर अड़चन

वर्ण जो अष्टक या हेक्साडेसिमल संख्या का उपयोग करके निर्दिष्ट किए गए हैं, वे कुछ मूल्यों तक सीमित हैं, निम्नानुसार हैं:

8-बिट गैर-यूटीएफ मोड

<0x100

8-बिट UTF-8 मोड

<0x10ffff और एक मान्य कोडपॉइंट

अमान्य यूनिकोड कोडपॉइंट्स 0xd800 से 0xdfff (तथाकथित "सरोगेट" कोडपॉइंट्स), और 0xffef रेंज के हैं।

चरित्र वर्गों में अनुक्रम से बच

सभी अनुक्रम जो एक एकल वर्ण मान को परिभाषित करते हैं, का उपयोग अंदर और बाहर दोनों वर्ण वर्गों के लिए किया जा सकता है। इसके अलावा, एक वर्ण वर्ग के अंदर, \ b को बैकस्पेस वर्ण (हेक्स 08) के रूप में व्याख्या की जाती है।

वर्ण वर्ग में \ N की अनुमति नहीं है। \ B, \ R, और \ X एक वर्ण वर्ग के अंदर विशेष नहीं हैं। अन्य गैर-मान्यता प्राप्त भागने के दृश्यों की तरह, उन्हें शाब्दिक वर्ण "बी", "आर" और "एक्स" के रूप में माना जाता है। एक चरित्र वर्ग के बाहर, इन दृश्यों के अलग-अलग अर्थ हैं।

असमर्थित बच अनुक्रम

पर्ल में, अनुक्रम \ l, \ L, \ u, और \ U को उसके स्ट्रिंग हैंडलर द्वारा पहचाना जाता है और निम्नलिखित वर्णों के मामले को संशोधित करने के लिए उपयोग किया जाता है। PCRE इन एस्केप अनुक्रमों का समर्थन नहीं करता है।

निरपेक्ष और सापेक्ष वापस संदर्भ

अनुक्रम \ g द्वारा एक अहस्ताक्षरित या एक नकारात्मक संख्या के बाद, वैकल्पिक रूप से ब्रेसिज़ में संलग्न, एक पूर्ण या सापेक्ष बैक संदर्भ है। एक नामित बैक संदर्भ को \ g {name} के रूप में कोडित किया जा सकता है। बाद के संदर्भों पर चर्चा की जाती है, जो कोष्ठक के उपसमूह की चर्चा के बाद होता है।

निरपेक्ष और सापेक्ष सबरूटीन कॉल

Oniguruma के साथ संगतता के लिए, गैर-पर्ल सिंटैक्स \ g जिसके नाम या संख्या को कोष्ठक या एकल कोट्स में संलग्न किया गया है, एक उपसमूह को "सबरूटीन" के रूप में संदर्भित करने के लिए वैकल्पिक वाक्य रचना है। विवरण पर बाद में चर्चा की जाती है। ध्यान दें कि \ g {...} (Perl syntax) और \ g <...> (Oniguruma syntax) पर्यायवाची नहीं हैं । पूर्व एक बैक रेफरेंस है और बाद वाला सबरूटीन कॉल है।

सामान्य वर्ण प्रकार

बैकलैश का एक अन्य उपयोग जेनेरिक चरित्र प्रकारों को निर्दिष्ट करने के लिए है:

\ घ
कोई दशमलव अंक
\ डी
कोई भी वर्ण जो दशमलव अंक नहीं है
\ h
कोई भी क्षैतिज व्हाट्सएप चरित्र
\ एच
कोई भी चरित्र जो एक क्षैतिज व्हाट्सएप चरित्र नहीं है
\ रों
कोई भी व्हाट्सएप चरित्र
\ एस
कोई भी चरित्र जो व्हाट्सएप चरित्र नहीं है
\ v
कोई भी वर्टिकल व्हाट्सएप चरित्र
\ वी
कोई भी वर्ण जो एक ऊर्ध्वाधर व्हाट्सएप चरित्र नहीं है
\ w
कोई भी "शब्द" वर्ण
\ डब्ल्यू
कोई भी "गैर-शब्द" चरित्र

एकल अनुक्रम \ N भी है, जो एक नॉन-न्यूलाइन वर्ण से मेल खाता है। यह "के रूप में ही है।" जब dotall सेट नहीं किया जाता है तो मेटाचैकर । पर्ल नाम से वर्णों का मिलान करने के लिए \ N का भी उपयोग करता है, लेकिन PCRE इसका समर्थन नहीं करता है।

लोअरकेस और अपरकेस की प्रत्येक जोड़ी अनुक्रम विभाजन को विभाजित करती है जो पात्रों के दो सेटों के दो सेटों में पूरा सेट करती है। कोई भी दिया गया पात्र एक, और प्रत्येक जोड़े में से केवल एक से मेल खाता है। अनुक्रम अंदर और बाहर दोनों वर्ण वर्गों में दिखाई दे सकते हैं। वे प्रत्येक उपयुक्त प्रकार के एक चरित्र से मेल खाते हैं। यदि वर्तमान मिलान बिंदु विषय स्ट्रिंग के अंत में है, तो सभी विफल हो जाते हैं, क्योंकि मिलान करने के लिए कोई वर्ण नहीं है।

पर्ल के साथ संगतता के लिए, \ _ ने वीटी कैरेक्टर (कोड 11) का मिलान नहीं किया, जिसने इसे पोसिक्स "स्पेस" क्लास से अलग बना दिया। हालांकि, पर्ल ने रिलीज़ 5.18 पर वीटी को जोड़ा, और पीसीआरई ने 8.34 रिलीज़ पर सूट का पालन किया। डिफ़ॉल्ट \ के वर्ण अब HT (9), LF (10), VT (11), FF (12), CR (13), और स्थान (32) हैं, जिन्हें "C" लोकेल में सफेद स्थान के रूप में परिभाषित किया गया है । यह सूची भिन्न हो सकती है यदि स्थान-विशिष्ट मिलान हो रहा हो। उदाहरण के लिए, कुछ स्थानों में "नॉन-ब्रेकिंग स्पेस" चरित्र (\ xA0) को सफेद स्थान के रूप में मान्यता प्राप्त है, और अन्य में वीटी चरित्र नहीं है।

एक "शब्द" वर्ण एक अंडरस्कोर या कोई भी वर्ण है जो एक अक्षर या एक अंक है। डिफ़ॉल्ट रूप से, अक्षरों और अंकों की परिभाषा को एसीसीएल के मामले (और विकल्प के बिना unicode ), आईएसओ लेटिन -1 वर्ण सेट में पीसीआरई कम मूल्यवान चरित्र तालिकाओं द्वारा नियंत्रित किया जाता है ।

डिफ़ॉल्ट रूप से, unicode मोड में, मानों के साथ वर्ण> 255, अर्थात, आईएसओ लैटिन -1 वर्ण सेट के बाहर के सभी वर्ण, कभी भी मैच से मेल नहीं खाते \ _ \ _, या \ _, और हमेशा \ _, \ _, और \ _ । ये क्रम मुख्य रूप से दक्षता कारणों के लिए UTF समर्थन उपलब्ध होने से पहले से ही अपने मूल अर्थ को बनाए रखते हैं। हालाँकि, यदि विकल्प ucp सेट किया गया है, तो व्यवहार को बदल दिया जाता है ताकि यूनिकोड गुणों का उपयोग वर्ण प्रकार निर्धारित करने के लिए किया जाए, जो निम्नानुसार है:

\ घ
कोई भी चरित्र जो \ p {Nd} मेल खाता है (दशमलव अंक)
\ रों
कोई भी वर्ण जो \ p {Z} या \ h या \ v है
\ w
कोई भी वर्ण जो \ p {L} या \ p {N} से मेल खाता है, साथ ही अंडरस्कोर

अपरकेस बच के पात्रों के व्युत्क्रम सेट से मेल खाता है। ध्यान दें कि \ d केवल दशमलव अंकों से मेल खाता है, जबकि \ w किसी भी यूनिकोड अंक, किसी भी यूनिकोड पत्र और अंडरस्कोर से मेल खाता है। ध्यान दें कि ucp \ b और \ B को भी प्रभावित करता है, क्योंकि वे \ w और \ W के संदर्भ में परिभाषित होते हैं। जब ucp सेट किया जाता है, तो इन दृश्यों का मिलान काफी धीमा होता है।

सीक्वेंस \ h, \ H, \ v, और \ V ऐसी विशेषताएं हैं जिन्हें रिलीज़ 5.10 में पर्ल में जोड़ा गया था। अन्य अनुक्रमों के विपरीत, जो डिफ़ॉल्ट रूप से केवल ASCII वर्णों से मेल खाते हैं, ये हमेशा कुछ उच्च-मूल्यवान कोड बिंदुओं से मेल खाते हैं, भले ही ucp सेट हो।

निम्नलिखित क्षैतिज अंतरिक्ष वर्ण हैं:

U + 0009
क्षैतिज टैब (HT)
U + 0020
अंतरिक्ष
U + 00A0
नॉन-ब्रेक स्पेस
U + 1680
ओघम अंतरिक्ष चिह्न
U + 180E
मंगोलियाई स्वर विभाजक
U + 2000
एन क्वाड
U + 2001
उन्हें क्वाड
U + 2002
एन स्पेस
U + 2003
उन्हें अंतरिक्ष
U + 2004
तीन-प्रति-एम स्पेस
U + 2005
चार-प्रति-एम स्पेस
U + 2006
छह-प्रति-एम स्पेस
U + 2007
चित्रा स्थान
U + 2008
विराम चिह्न स्थान
U + 2009
पतली जगह
U + 200A
बालों का स्थान
U + 202F
जगह नहीं तोड़ने की जगह
U + 205F
मध्यम गणितीय स्थान
U + 3000
आइडियोग्राफिक स्पेस

निम्नलिखित लंबवत स्थान वर्ण हैं:

U + 000A
लाइन फीड (LF)
U + 000B
कार्यक्षेत्र टैब (VT)
U + 000C
फॉर्म फ़ीड (एफएफ)
U + 000D
गाड़ी वापसी (CR)
U + 0085
अगली पंक्ति (NEL)
U + 2028
लाइन विभाजक
U + 2029
पैरा विभाजक

8-बिट, गैर-यूटीएफ -8 मोड में, कोड बिंदुओं के साथ केवल अक्षर <256 प्रासंगिक हैं।

न्यूलाइन अनुक्रम

एक वर्ण वर्ग के बाहर, डिफ़ॉल्ट रूप से, एस्केप अनुक्रम \ R किसी भी यूनिकोड न्यूलाइन अनुक्रम से मेल खाता है। गैर- UTF-8 मोड में, \ R निम्नलिखित के बराबर है:

(?>\r\n|\n|\x0b|\f|\r|\x85)

यह "परमाणु समूह" का एक उदाहरण है, विवरण नीचे दिए गए हैं।

यह विशेष समूह या तो दो-वर्ण अनुक्रम CR के बाद LF या एकल वर्ण LF (लाइन फीड, U + 000A), VT (वर्टिकल टैब, U + 000B), FF (फॉर्म फ़ीड, U + 000C) से मेल खाता है , CR (गाड़ी वापसी, U + 000D), या NEL (अगली पंक्ति, U + 0085)। दो-वर्ण अनुक्रम को एक एकल इकाई के रूप में माना जाता है जिसे विभाजित नहीं किया जा सकता है।

यूनिकोड मोड में, दो और वर्ण जिनके कोड पॉइंट> 255 हैं: एलएस (लाइन सेपरेटर, U + 2028) और PS (पैराग्राफ सेपरेटर, U + 2029)। इन पात्रों को पहचाने जाने के लिए यूनिकोड चरित्र संपत्ति समर्थन की आवश्यकता नहीं है।

\ R को केवल bsr_anycrlf संकलन समय पर या जब पैटर्न का मिलान किया जाता है तो विकल्प सेट करके केवल CR, LF या CRLF (यूनिकोड लाइन एंडिंग के पूर्ण सेट के बजाय) से मिलान करने के लिए प्रतिबंधित किया जा सकता है। (बीएसआर "बैकस्लैश आर" के लिए एक संक्षिप्त है।) पीसीआरई का निर्माण होने पर इसे डिफ़ॉल्ट बनाया जा सकता है; यदि ऐसा है, तो विकल्प के माध्यम से अन्य व्यवहार का अनुरोध किया जा सकता है bsr_unicode । इन सेटिंग्स को निम्न अनुक्रमों में से एक के साथ एक पैटर्न स्ट्रिंग शुरू करके भी निर्दिष्ट किया जा सकता है:

(* BSR_ANYCRLF)
सीआर, एलएफ, या सीआरएलएफ केवल
(* BSR_UNICODE)
कोई भी यूनिकोड न्यूलाइन अनुक्रम

ये डिफ़ॉल्ट और कंपाइलिंग फ़ंक्शन के लिए निर्दिष्ट विकल्पों को ओवरराइड करते हैं, लेकिन वे खुद को एक मिलान फ़ंक्शन के लिए निर्दिष्ट विकल्पों द्वारा ओवरराइड कर सकते हैं। ध्यान दें कि ये विशेष सेटिंग्स, जो पर्ल-संगत नहीं हैं, केवल एक पैटर्न की शुरुआत में मान्यता प्राप्त हैं, और यह कि उन्हें ऊपरी मामले में होना चाहिए। यदि उनमें से एक से अधिक मौजूद है, तो अंतिम एक का उपयोग किया जाता है। उन्हें न्यूलाइन कन्वेंशन के परिवर्तन के साथ जोड़ा जा सकता है; उदाहरण के लिए, एक पैटर्न के साथ शुरू हो सकता है:

(*ANY)(*BSR_ANYCRLF)

उन्हें (* UTF8), (* UTF), या (* UCP) विशेष अनुक्रमों के साथ भी जोड़ा जा सकता है। एक वर्ण वर्ग के अंदर, \ R को एक गैर-मान्यता प्राप्त अनुक्रम के रूप में माना जाता है, और इसलिए डिफ़ॉल्ट रूप से "R" अक्षर से मेल खाता है।

यूनिकोड चरित्र गुण

विशिष्ट गुणों वाले वर्णों से मेल खाने वाले तीन और एस्केप सीक्वेंस उपलब्ध हैं। जब 8-बिट गैर-यूटीएफ -8 मोड में होते हैं, तो ये क्रम परीक्षण के वर्णों तक सीमित होते हैं जिनके कोड पॉइंट <256 हैं, लेकिन वे इस मोड में काम करते हैं। निम्नलिखित अतिरिक्त बच क्रम हैं:

\ p { xx }
गुण xx वाला वर्ण
\ P { xx }
गुण xx के बिना एक चरित्र
\एक्स
एक यूनिकोड ने ग्रैफेम क्लस्टर का विस्तार किया

ऊपर xx द्वारा दर्शाए गए संपत्ति के नाम यूनिकोड लिपि के नामों, सामान्य श्रेणी के गुणों, "एनी" तक सीमित हैं, जो किसी भी चरित्र (न्यूलाइन सहित) और कुछ विशेष पीसीआरई गुणों (अगले भाग में वर्णित) से मेल खाते हैं। अन्य पर्ल गुण, जैसे "InMusicalSymbols", वर्तमान में PCRE द्वारा समर्थित नहीं हैं। ध्यान दें कि \ P {कोई भी} किसी भी वर्ण से मेल नहीं खाता है और हमेशा एक मैच की विफलता का कारण बनता है।

यूनिकोड वर्णों के समूह को कुछ लिपियों से संबंधित के रूप में परिभाषित किया गया है। उदाहरण के लिए, इन सेटों में से एक चरित्र का मिलान स्क्रिप्ट नाम से किया जा सकता है:

\p{Greek} \P{Han}

जो एक पहचान की गई स्क्रिप्ट का हिस्सा नहीं हैं, उन्हें "कॉमन" के रूप में एक साथ जोड़ा जाता है। निम्नलिखित स्क्रिप्ट की वर्तमान सूची है:

  • अरबी
  • अर्मेनियाई
  • अवेस्तन
  • बाली
  • बामम
  • Bassa_Vah
  • बटक
  • बंगाली
  • बोपोमोफो
  • ब्रेल
  • बगिनीस
  • बुहिड
  • Canadian_Aboriginal
  • कारियान
  • Caucasian_Albanian
  • चकमा
  • चाम
  • चेरोकी
  • सामान्य
  • कॉप्टिक
  • क्यूनेइफ़ॉर्म
  • साइप्रस
  • सिरिलिक
  • डीज़रेट
  • देवनागरी
  • Duployan
  • Egyptian_Hieroglyphs
  • एल्बासन
  • इथियोपिक
  • जॉर्जियाई
  • ग्लैगोलिटिक
  • गोथिक
  • ग्रंथ
  • यूनानी
  • गुजराती
  • गुरमुखी
  • हान
  • हंगुल
  • हानुनू
  • यहूदी
  • हीरागाना
  • Imperial_Aramaic
  • विरासत में मिला
  • Inscriptional_Pahlavi
  • Inscriptional_Parthian
  • जावानीस
  • कैथी
  • कन्नड़
  • काताकाना
  • Kayah_Li
  • खरोष्ठी
  • खमेर
  • खोजकी
  • Khudawadi
  • लाओ
  • लैटिन
  • लेपचा
  • लिम्बु
  • Linear_A
  • Linear_B
  • लिसू
  • Lycian
  • लिडियन
  • महाजनी
  • मलयालम
  • मैंडेइक
  • मैनिशैन
  • Meetei_Mayek
  • Mende_Kikakui
  • Meroitic_Cursive
  • Meroitic_Hieroglyphs
  • मियाओ
  • मोदी
  • मंगोलियन
  • एमआरओ
  • म्यांमार
  • Nabataean
  • New_Tai_Lue
  • एनको
  • ओगम
  • Ol_Chiki
  • Old_Italic
  • Old_North_Arabian
  • Old_Permic
  • Old_Persian
  • ओरिया
  • Old_South_Arabian
  • Old_Turkic
  • ओसमान्या
  • Pahawh_Hmong
  • Palmyrene
  • Pau_Cin_Hau
  • Phags_Pa
  • Phoenician
  • Psalter_Pahlavi
  • रेजांग
  • रूण का
  • सामरी
  • सौराष्ट्र
  • शारदा
  • शावियन
  • Siddham
  • सिंहली
  • Sora_Sompeng
  • सुंडानी
  • Syloti_Nagri
  • सिरिएक
  • तागालोग
  • तागबान्वा
  • Tai_Le
  • Tai_Tham
  • Tai_Viet
  • तकरी
  • तामिल
  • तेलुगू
  • थाना
  • थाई
  • तिब्बती
  • टिफ़िनाघ
  • मिथिलाक्षर
  • युगैरिटिक
  • Vai
  • Warang_Citi
  • यी

प्रत्येक वर्ण में एक यूनिकोड सामान्य श्रेणी की संपत्ति है, जो दो-अक्षर के संक्षिप्त नाम से निर्दिष्ट है। पर्ल के साथ अनुकूलता के लिए, उद्घाटन ब्रेस और संपत्ति के नाम के बीच एक खतना को शामिल करके नकारात्मकता को निर्दिष्ट किया जा सकता है। उदाहरण के लिए, \ p {^ लू} \ P {लू} के समान है।

यदि केवल एक अक्षर \ p या \ P के साथ निर्दिष्ट किया जाता है, तो इसमें सभी सामान्य श्रेणी गुण शामिल होते हैं जो उस पत्र से शुरू होते हैं। इस मामले में, नकारात्मकता की अनुपस्थिति में, भागने के क्रम में घुंघराले कोष्ठक वैकल्पिक हैं। निम्नलिखित दो उदाहरणों का एक ही प्रभाव है:

\p{L}
\pL

निम्नलिखित सामान्य श्रेणी के संपत्ति कोड समर्थित हैं:

सी
अन्य
प्रतिलिपि
नियंत्रण
सीएफ़
स्वरूप
Cn
सौंपे नहीं गए
सह
निजी उपयोग
सी
सरोगेट
एल
पत्र
ll
छोटा अक्षर
एलएम
संशोधन पत्र
आरे
अन्य पत्र
लेफ्टिनेंट
शीर्षक मामला पत्र
लू
बड़े अक्षर
एम
निशान
Mc
जगह का निशान
मुझे
अंकन चिह्न
Mn
गैर रिक्ति चिह्न
एन
संख्या
एन डी
दशमलव संख्या
nl
पत्र संख्या
नहीं
अन्य संख्या
पी
विराम चिह्न
पीसी
संबंधक विराम चिह्न
पी.डी.
पानी का छींटा
पीई
विराम चिह्न बंद करें
पीएफ
अंतिम विराम चिह्न
अनुकरणीय
प्रारंभिक विराम चिह्न
पो
अन्य विराम चिह्न
पी.एस.
खुला विराम चिह्न
एस
प्रतीक
अनुसूचित जाति
मुद्रा चिन्ह
Sk
संशोधक प्रतीक
एस.एम.
गणितीय प्रतीक
इसलिए
अन्य प्रतीक
जेड
सेपरेटर
zl
लाइन विभाजक
जिला परिषद
पैरा विभाजक
Zs
अंतरिक्ष विभाजक

विशेष संपत्ति एल एंड भी समर्थित है। यह एक ऐसे चरित्र से मेल खाता है जिसमें लू, Ll या Lt गुण है, जो कि एक अक्षर है जिसे एक संशोधक या "अन्य" के रूप में वर्गीकृत नहीं किया गया है।

Cs (सरोगेट) संपत्ति केवल U + D800 से U + DFFF श्रेणी के वर्णों पर लागू होती है। ऐसे वर्ण यूनिकोड स्ट्रिंग्स में अमान्य हैं और इसलिए PCRE द्वारा परीक्षण नहीं किया जा सकता है। पर्ल Cs संपत्ति का समर्थन नहीं करता है।

Perl द्वारा समर्थित संपत्ति के नामों के लंबे पर्यायवाची शब्द (जैसे कि \ p {पत्र}) PCRE द्वारा समर्थित नहीं हैं। "इन" के साथ इनमें से किसी भी गुण को उपसर्ग करने की अनुमति नहीं है।

यूनिकोड तालिका के किसी भी पात्र के पास Cn (अनसाइनड) संपत्ति नहीं है। इसके बजाय यह गुण किसी भी कोड बिंदु के लिए मान लिया गया है जो यूनिकोड तालिका में नहीं है।

लापरवाह मिलान निर्दिष्ट करने से इन एस्केप अनुक्रमों पर कोई प्रभाव नहीं पड़ता है। उदाहरण के लिए, \ p {लू} हमेशा केवल अपरकेस अक्षरों से मेल खाता है। यह पर्ल के वर्तमान संस्करणों के व्यवहार से अलग है।

यूनिकोड संपत्ति द्वारा वर्णों का मिलान तेज़ नहीं है, क्योंकि पीसीआरई को चरित्र गुण खोजने के लिए मल्टीस्टेज टेबल लुकअप करना चाहिए। यही कारण है कि पारंपरिक एस्केप सीक्वेंस जैसे \ d और \ w डिफ़ॉल्ट रूप से PCRE में यूनिकोड गुणों का उपयोग नहीं करते हैं। हालाँकि, आप विकल्प सेट ucp करके या (UCP) के साथ पैटर्न शुरू करके उन्हें ऐसा कर सकते हैं ।

विस्तारित ग्रैफेम क्लस्टर्स

\ X एस्केप यूनिकोड वर्णों की किसी भी संख्या से मेल खाता है जो "विस्तारित ग्रेपैम क्लस्टर" बनाता है, और अनुक्रम को परमाणु समूह के रूप में मानता है (नीचे देखें)। 8.31 तक और रिलीज़ सहित, PCRE एक पहले से, सरल परिभाषा से मेल खाता था जो इसके बराबर था (?>\PM\pM*) । यही है, यह "चिह्न" संपत्ति के बिना एक चरित्र से मेल खाता है, इसके बाद "चिह्न" संपत्ति के साथ शून्य या अधिक वर्ण हैं। "चिह्न" संपत्ति वाले वर्ण आमतौर पर गैर-रिक्ति वाले उच्चारण हैं जो पूर्ववर्ती चरित्र को प्रभावित करते हैं।

इस सरल परिभाषा को यूनिकोड में विस्तारित किया गया था, जिसमें प्रत्येक चरित्र को एक अंगूर तोड़ने वाली संपत्ति देकर अधिक जटिल प्रकार के समग्र चरित्र को शामिल किया गया था, और ऐसे नियम बनाए गए थे, जो इन गुणों का उपयोग करके विस्तारित अंगूर समूहों की सीमाओं को परिभाषित करते हैं। PCRE में 8.31 से बाद में रिलीज़ होता है, \ X इन समूहों में से एक से मेल खाता है।

\ X हमेशा कम से कम एक वर्ण से मेल खाता है। फिर यह तय करता है कि क्लस्टर समाप्त करने के लिए निम्नलिखित नियमों के अनुसार अधिक वर्ण जोड़ना है या नहीं:

  • विषय स्ट्रिंग के अंत में समाप्त करें।

  • सीआर और एलएफ के बीच समाप्त न करें; अन्यथा किसी भी नियंत्रण चरित्र के बाद समाप्त।

  • हंगुल (एक कोरियाई स्क्रिप्ट) शब्दांश अनुक्रम को न तोड़ें। हंगुल वर्ण पांच प्रकार के होते हैं: एल, वी, टी, एलवी, और एलवीटी। एक एल चरित्र का पालन एल, वी, एलवी, या एलवीटी चरित्र द्वारा किया जा सकता है। एक LV या V वर्ण का अनुसरण V या T वर्ण द्वारा किया जा सकता है। एक LVT ​​या T वर्ण का अनुसरण केवल T वर्ण द्वारा किया जा सकता है।

  • वर्णों या रिक्ति के निशान को बढ़ाने से पहले समाप्त न करें। "चिह्न" संपत्ति वाले वर्णों में हमेशा "विस्तार" करने वाली संपत्ति है।

  • वर्णों के बाद समाप्त न करें।

  • अन्यथा, क्लस्टर समाप्त करें।

PCRE अतिरिक्त गुण

पहले वर्णित मानक यूनिकोड गुणों के अलावा, PCRE चार और का समर्थन करता है जो पारंपरिक एस्केप सीक्वेंस, जैसे \ w और \ के लिए यूनिकोड गुणों का उपयोग करना संभव बनाता है। पीसीआरई ucp विकल्प के पारित होने पर आंतरिक रूप से इन गैर-मानक, गैर-पर्ल गुणों का उपयोग करता है। हालांकि, उनका उपयोग स्पष्ट रूप से भी किया जा सकता है। गुण इस प्रकार हैं:

Xan

कोई अल्फ़ान्यूमेरिक वर्ण। उन वर्णों से मेल खाता है जिनके पास L (अक्षर) या N (संख्या) गुण है।

XPS

कोई भी पॉज़िक्स स्पेस कैरेक्टर। वर्ण टैब, लाइन फीड, वर्टिकल टैब, फॉर्म फीड, कैरिज रिटर्न, और किसी भी अन्य वर्ण से मेल खाता है जिसमें Z (विभाजक) गुण है।

XSP

कोई भी पर्ल स्पेस चरित्र। एक्सपीएस के समान ही मेल खाता है, सिवाय इसके कि ऊर्ध्वाधर टैब को बाहर रखा गया है।

XWD

कोई भी पर्ल "शब्द" चरित्र। Xan, प्लस अंडरस्कोर के समान वर्णों से मेल खाता है।

Perl और POSIX स्पेस अब समान हैं। पर्ल ने वीटी को 5.18 और पीसीआरई के रिलीज के सेट पर अपने स्पेस कैरेक्टर में जोड़ा और 8.34 रिलीज में बदल गया।

Xan उन वर्णों से मेल खाता है जिनके पास L (अक्षर) या N (संख्या) गुण है। Xps वर्ण टैब, लाइनफीड, वर्टिकल टैब, फॉर्म फीड, या कैरिज रिटर्न, और किसी भी अन्य वर्ण से मेल खाता है जिसमें Z (विभाजक) गुण है। Xsp Xps के समान है; पेरल कम्पैटिबिलिटी के लिए यह वर्टिकल टैब को बाहर करता था, लेकिन पर्ल बदल गया, और इसलिए PCRE ने 8.34 रिलीज किया। Xwd Xan के समान वर्णों के साथ मेल खाता है, साथ ही अंडरस्कोर भी।

एक और गैर-मानक संपत्ति है, Xuc, जो किसी भी चरित्र से मेल खाती है जिसे C ++ और अन्य प्रोग्रामिंग भाषाओं में एक यूनिवर्सल कैरेक्टर नाम द्वारा दर्शाया जा सकता है। ये पात्र हैं $, @, `(गंभीर उच्चारण), और यूनिकोड कोड पॉइंट्स के साथ सभी वर्ण> = U + 00A0, सरोगेट्स U + D800 से U + DFFF को छोड़कर। ध्यान दें कि अधिकांश आधार (ASCII) वर्णों को बाहर रखा गया है। (यूनिवर्सल कैरेक्टर के नाम फॉर्म \ uHHHH या \ UHHHHHHHH के हैं, जहाँ H एक हेक्साडेसिमल अंक है। ध्यान दें कि Xuc प्रॉपर्टी इन अनुक्रमों से मेल नहीं खाती है लेकिन वे जो अक्षर दर्शाती हैं)

मैच प्रारंभ को रीसेट करना

पलायन अनुक्रम \ K किसी भी पहले से मिलान किए गए वर्णों को अंतिम मिलान अनुक्रम में शामिल नहीं करने का कारण बनता है। उदाहरण के लिए, निम्न पैटर्न "फ़ोबोबार" से मेल खाता है, लेकिन रिपोर्ट करता है कि यह "बार" से मेल खाता है:

foo\Kbar

यह सुविधा एक खोज के दावे के समान है (नीचे वर्णित है)। हालांकि, इस मामले में, वास्तविक मैच से पहले विषय का हिस्सा निश्चित लंबाई का नहीं होना चाहिए, जैसा कि शोधकर्ता करते हैं। \ K का उपयोग कैप्चर किए गए सबस्ट्रिंग की सेटिंग में हस्तक्षेप नहीं करता है। उदाहरण के लिए, जब निम्न पैटर्न "फ़ोबोबार" से मेल खाता है, तो पहला विकल्प अभी भी "फू" पर सेट है:

(foo)\Kbar

पर्ल दस्तावेज़ जो दावा के भीतर \ K का उपयोग "अच्छी तरह से परिभाषित नहीं है"। पीसीआरई में, \ K पर तब कार्रवाई की जाती है जब यह सकारात्मक अभिक्रियाओं के अंदर होता है, लेकिन नकारात्मक कथनों में इसे अनदेखा कर दिया जाता है। ध्यान दें कि जब एक पैटर्न जैसे (? = Ab \ K) से मेल खाता है, तो मैच की रिपोर्ट की गई शुरुआत मैच के अंत से अधिक हो सकती है।

सरल कथनों

बैकस्लैश का अंतिम उपयोग कुछ सरल कथनों के लिए है। एक कथन एक ऐसी स्थिति को निर्दिष्ट करता है, जो मैच में किसी विशेष बिंदु पर, विषय स्ट्रिंग से किसी भी पात्र का उपभोग किए बिना मिलना चाहिए। अधिक जटिल अभिकथनों के लिए उपपट्टों का उपयोग नीचे वर्णित है। निम्नलिखित उल्लिखित दावे हैं:

\ b
एक शब्द सीमा पर मेल खाता है।
\ बी
मेल खाता है जब एक शब्द सीमा पर नहीं।
\ए
विषय के प्रारंभ में मेल खाता है।
\ जेड
विषय के अंत में मेल खाता है, और विषय के अंत में एक नई पंक्ति से पहले।
\ z
विषय के अंत में ही मेल खाता है।
\ जी
विषय में पहली मिलान स्थिति पर मेल खाता है।

एक चरित्र वर्ग के अंदर, \ b का एक अलग अर्थ है; यह बैकस्पेस वर्ण से मेल खाता है। यदि इनमें से कोई अन्य अभिकथन वर्ण वर्ग में दिखाई देता है, तो डिफ़ॉल्ट रूप से यह संबंधित शाब्दिक वर्ण से मेल खाता है (उदाहरण के लिए, \ B अक्षर B से मेल खाता है)।

एक शब्द सीमा विषय स्ट्रिंग में एक स्थिति है जहां वर्तमान चरित्र और पिछला चरित्र दोनों \ w या \ W से मेल नहीं खाते (अर्थात, एक मैच \ w और दूसरा मैच \ W), या शुरू या अंत स्ट्रिंग यदि पहला या अंतिम वर्ण क्रमशः \ w से मेल खाता है। UTF मोड में, विकल्प सेट करके \ w और \ W का अर्थ बदला जा सकता है ucp । जब यह किया जाता है, तो यह \ b और \ B को भी प्रभावित करता है। पीसीआरई और पर्ल के पास अलग-अलग "शब्द की शुरुआत" या "शब्द का अंत" मेटासेकेंस नहीं है। हालाँकि, जो कुछ भी इस प्रकार है वह सामान्य रूप से निर्धारित करता है। उदाहरण के लिए, एक शब्द की शुरुआत में अंश "बा" से "मेल खाता है"।

\ A, \ Z, और \ z मुखर पारंपरिक परिधि और डॉलर (अगले भाग में वर्णित) से भिन्न होते हैं, जिसमें वे कभी भी विषय स्ट्रिंग के आरंभ और अंत में मेल खाते हैं, जो भी विकल्प निर्धारित हैं। इस प्रकार, वे मल्टीलाइन मोड से स्वतंत्र हैं। ये तीन दावे विकल्पों से प्रभावित नहीं होते हैं notbol या noteol , जो केवल राउंडफ्लेक्स और डॉलर मेटाचैकर के व्यवहार को प्रभावित करते हैं। हालांकि, अगर तर्क startoffset की run/3 गैर-शून्य है, यह दर्शाता है कि मिलान विषय की शुरुआत के अलावा किसी अन्य बिंदु पर शुरू करने के लिए है, \ एक मैच कभी नहीं कर सकते हैं। \ Z और \ z के बीच का अंतर यह है कि स्ट्रिंग के अंत में एक नई रेखा से पहले और बहुत अंत में \ Z मैच होता है, जबकि \ z केवल अंत में मेल खाता है।

जब तर्क startoffset के निर्दिष्ट द्वारा मैच की शुरुआत बिंदु पर वर्तमान मिलान की स्थिति में है, तभी \ G अभिकथन सही है run/3 । जब startoffset गैर-शून्य का मान होता है, तो यह \ A से भिन्न होता है। run/3 उपयुक्त तर्कों के साथ कई बार कॉल करके , आप पर्ल विकल्प की नकल कर सकते हैं /g , और यह इस तरह के कार्यान्वयन में है जहां \ G उपयोगी हो सकते हैं।

हालाँकि, नोटिस, कि वर्तमान मैच की शुरुआत के रूप में, \ G की PCRE व्याख्या, पर्ल से बिल्कुल अलग है, जो इसे पिछले मैच के अंत के रूप में परिभाषित करता है। पर्ल में, ये अलग हो सकते हैं जब पहले से मिलान स्ट्रिंग खाली था। जैसा कि पीसीआरई एक समय में केवल एक मैच करता है, यह इस व्यवहार को पुन: पेश नहीं कर सकता है।

यदि किसी पैटर्न के सभी विकल्प \ G से शुरू होते हैं, तो अभिव्यक्ति को प्रारंभिक मिलान स्थिति में एंकर किया जाता है, और "एंकर" ध्वज को संकलित नियमित अभिव्यक्ति में सेट किया जाता है।

सर्कमफ्लेक्स और डॉलर

Circumflex और डॉलर मेटाचैकर शून्य-चौड़ाई के दावे हैं। यही है, वे विषय स्ट्रिंग से किसी भी वर्ण का उपभोग किए बिना किसी विशेष स्थिति के लिए सही होने के लिए परीक्षण करते हैं।

एक चरित्र वर्ग के बाहर, डिफ़ॉल्ट मिलान मोड में, circumflex वर्ण एक जोर है जो केवल तभी होता है जब विषय मिलान के प्रारंभ में वर्तमान मिलान बिंदु होता है। तो तर्क startoffset की run/3 गैर-शून्य है, स्वरित कभी भी मेल नहीं कर सकते हैं अगर विकल्प multiline सेट नहीं की जाती। एक चरित्र वर्ग के अंदर, circumflex का एक बिल्कुल अलग अर्थ है (नीचे देखें)।

यदि कुछ विकल्प शामिल हैं, तो सर्कमफ्लेक्स को पैटर्न का पहला चरित्र होने की आवश्यकता नहीं है, लेकिन यह प्रत्येक विकल्प में पहली चीज़ है जिसमें यह प्रतीत होता है कि पैटर्न कभी उस शाखा से मेल खाता है यदि सभी संभावित विकल्प एक परिधि के साथ शुरू होते हैं, अर्थात, यदि पैटर्न केवल विषय की शुरुआत में मेल खाने के लिए विवश है, तो इसे "एंकर" पैटर्न कहा जाता है। (अन्य निर्माण भी हैं जो एक पैटर्न का कारण बन सकते हैं।)

डॉलर चरित्र एक जोर है जो केवल तभी सही है जब वर्तमान मिलान बिंदु विषय स्ट्रिंग के अंत में है, या स्ट्रिंग के अंत में एक नई रेखा से पहले (डिफ़ॉल्ट रूप से)। ध्यान दें कि यह न्यूलाइन से मेल नहीं खाता है। यदि कुछ विकल्प शामिल हैं, तो डॉलर को पैटर्न का अंतिम चरित्र नहीं होना चाहिए, लेकिन यह किसी भी शाखा में अंतिम आइटम होना है। चरित्र वर्ग में डॉलर का कोई विशेष अर्थ नहीं है।

डॉलर के अर्थ को बदला जा सकता है ताकि यह dollar_endonly संकलन के समय पर विकल्प सेट करके, स्ट्रिंग के बहुत अंत में मेल खाता हो । यह \ Z जोर को प्रभावित नहीं करता है।

यदि विकल्प multiline सेट किया जाता है, तो circumflex और डॉलर वर्णों के अर्थ बदल जाते हैं । जब यह मामला होता है, तो आंतरिक न्यूलाइन्स के तुरंत बाद और विषय स्ट्रिंग की शुरुआत में एक राउंडफ्लेक्स मेल खाता है। यह एक नई पंक्ति के बाद मेल नहीं खाता है जो स्ट्रिंग को समाप्त करता है। एक स्ट्रिंग में किसी भी नई सूची से पहले एक डॉलर मेल खाता है, और बहुत अंत में, जब multiline सेट किया जाता है। जब न्यूलाइन को दो-वर्ण अनुक्रम CRLF के रूप में निर्दिष्ट किया जाता है, तो अलग-थलग CR और LF वर्ण नई सूचियों को इंगित नहीं करते हैं।

उदाहरण के लिए, पैटर्न / ^ abc $ / विषय स्ट्रिंग "def \ nabc" से मेल खाता है (जहां \ n एक बहु पंक्ति मोड में एक नई रेखा का प्रतिनिधित्व करता है), लेकिन अन्यथा नहीं। तो, पैटर्न है कि एकल लाइन मोड में सहारा लेने लगते हैं क्योंकि सभी शाखाओं ^ के साथ शुरू बहु मोड में लंगर डाले नहीं कर रहे हैं, और स्वरित के लिए एक मैच संभव है जब तर्क startoffset की run/3 गैर-शून्य है। dollar_endonly यदि multiline सेट है तो विकल्प को अनदेखा कर दिया जाता है।

ध्यान दें कि अनुक्रम \ A, \ Z, और \ z का उपयोग दोनों मोड में विषय के प्रारंभ और अंत से मेल खाने के लिए किया जा सकता है। यदि किसी पैटर्न की सभी शाखाएँ \ A से शुरू होती हैं, तो यह हमेशा एंकर होती है, भले ही multiline वह सेट हो।

पूर्ण विराम (अवधि, डॉट) और \ N

एक वर्ण वर्ग के बाहर, पैटर्न में एक बिंदु विषय स्ट्रिंग में किसी भी चरित्र से मेल खाता है (डिफ़ॉल्ट रूप से) एक चरित्र जो एक पंक्ति के अंत को दर्शाता है।

जब एक पंक्ति की समाप्ति को एकल वर्ण के रूप में परिभाषित किया जाता है, तो डॉट उस चरित्र से कभी मेल नहीं खाता। जब दो-वर्ण अनुक्रम सीआरएलएफ का उपयोग किया जाता है, तो डॉट सीआर से मेल नहीं खाता है यदि इसे तुरंत एलएफ द्वारा पीछा किया जाता है, अन्यथा यह सभी पात्रों (पृथक सीआर और एलएफ सहित) से मेल खाता है। जब किसी भी यूनिकोड लाइन के अंत को मान्यता दी जाती है, तो डॉट सीआर, एलएफ, या किसी अन्य लाइन-एंड अक्षरों से मेल नहीं खाता है।

Newlines के बारे में डॉट के व्यवहार को बदला जा सकता है। यदि विकल्प dotall सेट किया गया है, तो बिना किसी अपवाद के एक बिंदु किसी भी वर्ण से मेल खाता है। यदि दो-वर्ण अनुक्रम CRLF विषय स्ट्रिंग में मौजूद है, तो इसे मिलान करने के लिए दो बिंदु लगते हैं।

डॉट की हैंडलिंग पूरी तरह से circumflex और डॉलर की हैंडलिंग से स्वतंत्र है, एकमात्र संबंध यह है कि दोनों में नई सुर्खियां हैं। चरित्र वर्ग में डॉट का कोई विशेष अर्थ नहीं है।

एस्केप सीक्वेंस \ N एक बिंदी की तरह व्यवहार करता है, सिवाय इसके कि यह विकल्प से प्रभावित नहीं है PCRE_DOTALL । यही है, यह किसी भी वर्ण से मेल खाता है सिवाय एक के जो एक पंक्ति के अंत का प्रतीक है। पर्ल नाम से वर्णों का मिलान करने के लिए \ N का भी उपयोग करता है लेकिन PCRE इसका समर्थन नहीं करता है।

एकल डेटा इकाई से मेल खाना

यदि कोई UTF मोड सेट है, तो वर्ण वर्ग के बाहर, एस्केप सीक्वेंस किसी भी डेटा यूनिट से मेल खाता है। एक डेटा यूनिट एक बाइट है। एक डॉट के विपरीत, \ C हमेशा लाइन-एंडिंग अक्षरों से मेल खाता है। सुविधा UTL-8 मोड में व्यक्तिगत बाइट्स से मेल करने के लिए पर्ल में दी गई है, लेकिन यह स्पष्ट नहीं है कि इसका उपयोग कैसे किया जा सकता है। जैसा कि \ C व्यक्तिगत डेटा इकाइयों में वर्णों को तोड़ता है, UTF मोड में \ C के साथ एक इकाई के मिलान का अर्थ है कि शेष स्ट्रिंग एक विकृत UTF वर्ण के साथ शुरू हो सकती है। इसका अपरिभाषित परिणाम है, जैसा कि PCRE मानता है कि यह मान्य UTF स्ट्रिंग्स से संबंधित है।

PCRE एक UTF मोड में अभिकर्मकों (नीचे वर्णित) को देखने की अनुमति नहीं देता है, क्योंकि इससे लुकबाइंड की लंबाई की गणना करना असंभव हो जाएगा।

The C C से बचने का क्रम सबसे अच्छा है। हालांकि, इसका उपयोग करने का एक तरीका यह है कि विकृत UTF वर्णों की समस्या से बचा जाता है, अगले वर्ण की लंबाई की जाँच करने के लिए एक लुकहेड का उपयोग करना है, जैसा कि निम्न पैटर्न में है, जिसे UTF-8 स्ट्रिंग के साथ प्रयोग किया जा सकता है (व्हॉट्सएप और लाइन को अनदेखा करें) टूट जाता है):

(?| (?=[\x00-\x7f])(\C) |
    (?=[\x80-\x{7ff}])(\C)(\C) |
    (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) |
    (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C))

एक समूह जो (?!) के साथ शुरू होता है, प्रत्येक विकल्प (देखें अनुभाग Duplicate Subpattern Numbers ) में कैप्चरिंग कोष्ठक संख्याओं को रीसेट करता है । प्रत्येक शाखा की शुरुआत में अभिकर्मक उन मानों के लिए अगले UTF-8 वर्ण की जांच करते हैं जिनके एन्कोडिंग 1, 2, 3, या 4 बाइट्स का उपयोग करते हैं , क्रमशः। चरित्र के अलग-अलग बाइट्स को उचित संख्या में समूहों द्वारा कैप्चर किया जाता है।

वर्ग ब्रैकेट और चरित्र वर्ग

एक उद्घाटन वर्ग ब्रैकेट एक वर्ण वर्ग का परिचय देता है, जिसे एक समापन वर्ग ब्रैकेट द्वारा समाप्त किया जाता है। अपने आप पर एक बंद वर्ग ब्रैकेट डिफ़ॉल्ट रूप से विशेष नहीं है। हालाँकि, यदि विकल्प PCRE_JAVASCRIPT_COMPAT सेट किया गया है, तो एक अकेला समापन वर्ग ब्रैकेट एक संकलन-समय त्रुटि का कारण बनता है। यदि वर्ग के एक सदस्य के रूप में एक क्लोजिंग स्क्वायर ब्रैकेट की आवश्यकता होती है, तो यह कक्षा में पहला डेटा वर्ण होना चाहिए (एक प्रारंभिक परिधि के बाद, यदि मौजूद है) या बैकस्लैश के साथ भाग गया।

एक चरित्र वर्ग विषय में एक ही चरित्र से मेल खाता है। UTF मोड में, वर्ण एक डेटा इकाई से अधिक लंबा हो सकता है। एक मिलान वर्ण वर्ग द्वारा परिभाषित वर्णों के समुच्चय में होना चाहिए, जब तक कि वर्ग परिभाषा में पहला वर्ण परिधि न हो, उस स्थिति में विषय वर्ण वर्ग द्वारा परिभाषित समुच्चय में नहीं होना चाहिए। यदि कक्षा के एक सदस्य के रूप में एक circumflex आवश्यक है, तो सुनिश्चित करें कि यह पहला चरित्र नहीं है, या बैकस्लैश के साथ इसे छोड़ दें।

उदाहरण के लिए, वर्ण वर्ग [aeiou] किसी भी निचले स्वर से [^aeiou] मेल खाता है , जबकि किसी भी वर्ण से मेल खाता है जो निचला अक्षर नहीं है। ध्यान दें कि एक circumflex उन वर्णों को निर्दिष्ट करने के लिए एक सुविधाजनक संकेतन है जो वर्ग में हैं जो उन लोगों की गणना करके हैं। एक वर्ग जो एक परिधि के साथ शुरू होता है वह एक जोर नहीं है; यह अभी भी विषय स्ट्रिंग से एक चरित्र का उपभोग करता है, और इसलिए यह विफल हो जाता है यदि वर्तमान सूचक स्ट्रिंग के अंत में है।

UTF-8 मोड में, मान> 255 (0xffff) वाले वर्णों को एक वर्ग में डेटा इकाइयों के शाब्दिक स्ट्रिंग के रूप में, या \ x {एस्केपिंग तंत्र का उपयोग करके शामिल किया जा सकता है।

जब केसलेस मिलान सेट हो जाता है, तो कक्षा में कोई भी अक्षर उनके अपरकेस और लोअरकेस संस्करण दोनों का प्रतिनिधित्व करता है। उदाहरण के लिए, एक केसलेस [aeiou] "ए" और "ए" से मेल खाता है, और [^aeiou] एक केसलेस "ए" से मेल नहीं खाता है, लेकिन मामला संस्करण होगा। UTF मोड में, PCRE हमेशा उन वर्णों के लिए मामले की अवधारणा को समझता है जिनके मान <256 हैं, इसलिए केसलेस मिलान हमेशा संभव है। उच्च मूल्यों वाले पात्रों के लिए, केस की अवधारणा का समर्थन केवल तभी किया जाता है जब पीसीआरई को यूनिकोड संपत्ति समर्थन के साथ संकलित किया जाता है। यदि आप अक्षरों के लिए UTF मोड में लापरवाह मिलान का उपयोग करना चाहते हैं> =, सुनिश्चित करें कि PCRE को यूनिकोड संपत्ति समर्थन और UTF समर्थन के साथ संकलित किया गया है।

वर्ण खंडों को इंगित करने वाले वर्ण वर्ण वर्गों का मिलान करते समय कभी भी किसी विशेष तरीके से व्यवहार नहीं किया जाता है, जो भी पंक्ति-अंत अनुक्रम उपयोग में है, और जो भी विकल्प की सेटिंग है PCRE_DOTALL और PCRE_MULTILINE जिसका उपयोग किया जाता है। एक वर्ग जैसे [^] हमेशा इन वर्णों में से एक से मेल खाता है।

चरित्र वर्ग में वर्णों की एक श्रृंखला को निर्दिष्ट करने के लिए माइनस (हाइफ़न) वर्ण का उपयोग किया जा सकता है। उदाहरण के लिए, [डीएम] डी और एम, समावेशी के बीच किसी भी पत्र से मेल खाता है। यदि किसी वर्ग में माइनस कैरेक्टर की आवश्यकता होती है, तो उसे बैकस्लैश से बच जाना चाहिए या ऐसी स्थिति में प्रकट होना चाहिए, जहां किसी श्रेणी को इंगित करने के रूप में व्याख्या नहीं की जा सकती है, आमतौर पर कक्षा में पहले या अंतिम चरित्र के रूप में, या एक सीमा के तुरंत बाद। उदाहरण के लिए, [bdz] श्रेणी बी से डी, एक हाइफ़न वर्ण, या जेड में अक्षरों से मेल खाती है।

शाब्दिक वर्ण "]" श्रेणी का अंतिम वर्ण नहीं हो सकता। एक पैटर्न जैसे [W-] 46] की व्याख्या दो वर्णों के वर्ग के रूप में की जाती है ("W" और "-") "जिसके बाद एक शाब्दिक स्ट्रिंग" 46] "होता है, इसलिए यह" W46] या "-46" से मेल खाता है "। हालाँकि, यदि "]" बैकस्लैश के साथ बच जाता है, तो इसे सीमा के अंत के रूप में व्याख्या की जाती है, इसलिए [W - \] 46] को एक श्रेणी के रूप में व्याख्या की जाती है, जिसमें दो अन्य वर्णों की श्रेणी होती है। "]" के अष्टक या हेक्साडेसिमल निरूपण का उपयोग किसी सीमा को समाप्त करने के लिए भी किया जा सकता है।

यदि POSIX वर्ण वर्ग (नीचे देखें) या किसी एकल वर्ण को परिभाषित करने वाले किसी अन्य भाग से भागने का क्रम उत्पन्न होता है, तो यह उस बिंदु पर प्रकट होता है, जहाँ श्रेणी समाप्ति वर्ण अपेक्षित होता है। उदाहरण के लिए, [z- \ xff] वैध है, लेकिन [A- \ d] और [A - [अंक:]] नहीं हैं।

रंग चरित्र मूल्यों के टकराव क्रम में काम करते हैं। उनका उपयोग संख्यात्मक रूप से निर्दिष्ट वर्णों के लिए भी किया जा सकता है, उदाहरण के लिए, [\ 000- \ 037]। सीमाओं में कोई भी वर्ण शामिल हो सकता है जो वर्तमान मोड के लिए मान्य हो।

यदि एक सीमा जिसमें अक्षर शामिल होते हैं, जब कासली मिलान सेट किया जाता है, तो यह या तो मामले में अक्षरों से मेल खाता है। उदाहरण के लिए, [Wc] [] [\\ ^ _` wxyzabc] के बराबर है, लापरवाही से मेल खाता है। एक गैर-UTF मोड में, यदि किसी फ्रांसीसी लोकेल के लिए कैरेक्टर टेबल का उपयोग किया जाता है, तो [\ xc8- \ xcb] दोनों मामलों में उच्चारण किए गए ई अक्षर से मेल खाते हैं। UTF मोड्स में, PCRE मूल्यों के साथ केस की अवधारणा का समर्थन करता है> 255 केवल तभी जब इसे यूनिकोड प्रॉपर्टी सपोर्ट के साथ संकलित किया जाता है।

चरित्र से बचना क्रम \ d, \ D, \ H, \ H, \ p, \ P, \ S, \ S, \ v, \ V, \ w, और \ W एक चरित्र वर्ग में दिखाई दे सकता है, और जोड़ वर्ण जो वे वर्ग से मेल खाते हैं। उदाहरण के लिए, [\ dABCDEF] किसी भी हेक्साडेसिमल अंक से मेल खाता है। UTF मोड में, विकल्प ucp \ d, \ s, \ w और उनके अपरकेस भागीदारों के अर्थ को प्रभावित करता है, ठीक वैसे ही जब वे किसी वर्ण वर्ग के बाहर दिखाई देते हैं, जैसा कि Generic Character Types पहले खंड में वर्णित है । भागने का क्रम \ b का वर्ण वर्ग के अंदर एक अलग अर्थ है; यह बैकस्पेस वर्ण से मेल खाता है। किसी वर्ण वर्ग के अंदर अनुक्रम \ B, \ N, \ R, और \ X विशेष नहीं हैं। किसी भी अन्य गैर-मान्यता प्राप्त एस्केप सीक्वेंस की तरह, उन्हें शाब्दिक पात्रों "बी", "एन", "आर" और "एक्स" के रूप में माना जाता है।

एक कम्फ़्लेक्स आसानी से अपरकेस वर्ण प्रकार के साथ इस्तेमाल किया जा सकता है ताकि मेल खाने वाले लोअरकेस प्रकार की तुलना में वर्णों के अधिक प्रतिबंधित सेट को निर्दिष्ट किया जा सके। उदाहरण के लिए, वर्ग [^ \ W_] किसी अक्षर या अंक से मेल खाता है, लेकिन अंडरस्कोर नहीं है, जबकि [\ w] में अंडरस्कोर शामिल है। एक सकारात्मक चरित्र वर्ग को "कुछ या कुछ या ..." और एक नकारात्मक वर्ग को "कुछ नहीं और कुछ नहीं और नहीं ..." के रूप में पढ़ा जाना है।

चरित्र वर्ग में केवल निम्नलिखित मेटाचैकर्स को मान्यता दी जाती है:

  • बैकस्लैश
  • हाइफ़न (केवल जहाँ इसे किसी श्रेणी को निर्दिष्ट करने के रूप में व्याख्या किया जा सकता है)
  • सर्कमफ्लेक्स (केवल शुरुआत में)
  • स्क्वायर ब्रैकेट खोलना (केवल जब यह एक पॉज़िक्स वर्ग नाम, या एक विशेष संगतता सुविधा के लिए शुरू करने के रूप में व्याख्या की जा सकती है; अगले दो खंड देखें)
  • समापन वर्ग कोष्ठक

हालांकि, अन्य गैर-अल्फ़ान्यूमेरिक वर्णों से बचने से कोई नुकसान नहीं होता है।

पॉज़िक्स चरित्र वर्ग

पर्ल चरित्र वर्गों के लिए Posix संकेतन का समर्थन करता है। यह संलग्न वर्ग कोष्ठक के भीतर [और:] द्वारा संलग्न नामों का उपयोग करता है। PCRE भी इस संकेतन का समर्थन करता है। उदाहरण के लिए, निम्नलिखित मैच "0", "1", कोई वर्णमाला वर्ण, या "%"

[01[:alpha:]%]

निम्नलिखित समर्थित वर्ग नाम हैं:

alnum
पत्र और अंक
अल्फा
पत्र
ascii
चरित्र कोड 0-127
रिक्त
केवल स्थान या टैब
cntrl
पात्रों पर नियंत्रण रखें
अंक
दशमलव अंक (d के समान)
ग्राफ
मुद्रण वर्ण, अंतरिक्ष को छोड़कर
कम
छोटे अक्षर
छाप
अंतरिक्ष सहित मुद्रण वर्ण
punct
अक्षर, अंक और स्थान को छोड़कर मुद्रण वर्ण
अंतरिक्ष
व्हॉट्सएप (पीसीआरई 8.34 से वही)
ऊपरी
बड़ी वर्तनी के अक्षर
शब्द
"शब्द" अक्षर (\ w के समान)
xdigit
हेक्साडेसिमल अंक

डिफ़ॉल्ट "स्पेस" अक्षर HT (9), LF (10), VT (11), FF (12), CR (13) और स्पेस (32) हैं। यदि स्थान-विशिष्ट मिलान हो रहा है, तो अंतरिक्ष वर्णों की सूची भिन्न हो सकती है; उनमें से कम या अधिक हो सकते हैं। "स्पेस" का उपयोग अलग-अलग \ _ के लिए किया जाता था, जिसमें पर्ल संगतता के लिए वीटी शामिल नहीं था। हालांकि, पर्ल रिलीज़ 5.18 पर बदल गया, और पीसीआरई ने 8.34 रिलीज़ किया। "स्पेस" और \ _ अब वर्णों के एक ही सेट से मेल खाते हैं।

"शब्द" नाम एक पर्ल एक्सटेंशन है, और "रिक्त" पर्ल 5.8 से एक जीएनयू एक्सटेंशन है। एक और पर्ल विस्तार नकार है, जो बृहदान्त्र के बाद एक ^ चरित्र द्वारा इंगित किया गया है। उदाहरण के लिए, निम्नलिखित मैच "1", "2", या कोई गैर अंक:

[12[:^digit:]]

PCRE (Perl) भी Posix सिंटैक्स [.ch।] और [= ch =] को पहचानता है, जहाँ "ch" एक "कोलेटिंग एलिमेंट" है, लेकिन ये समर्थित नहीं हैं, और इनका सामना करने पर एक त्रुटि दी जाती है।

डिफ़ॉल्ट रूप से, मान> 255 वाले वर्ण पॉज़िक्स वर्ण वर्गों में से किसी से मेल नहीं खाते। हालाँकि, यदि विकल्प PCRE_UCP पास हो जाता है pcre_compile() , तो कुछ वर्गों को बदल दिया जाता है, ताकि यूनिकोड के चरित्र गुणों का उपयोग किया जा सके। यह कुछ अनुक्रम वर्गों द्वारा अन्य अनुक्रमों द्वारा प्रतिस्थापित करके प्राप्त किया जाता है, इस प्रकार है:

[: Alnum:]
बन जाता है \ p {Xan}
[: अल्फा:]
बन जाता है \ p {L}
[: रिक्त:]
हो जाता है \ h
[:अंक:]
बन जाता है \ p {एनडी}
[: कम:]
बन जाता है \ p {Ll}
[: अंतरिक्ष:]
बन जाता है \ p {Xps}
[ऊपरी:]
बन जाता है \ p {लू}
[:शब्द:]
बन जाता है \ p {Xwd}

नकारात्मक संस्करण, जैसे कि [: ^ अल्फा:], \ p के बजाय \ P का उपयोग करें। तीन अन्य POSIX कक्षाएं विशेष रूप से UCP मोड में नियंत्रित की जाती हैं:

[: ग्राफ:]

यह उन वर्णों से मेल खाता है जिनमें ग्लिफ़ हैं जो मुद्रित होने पर पृष्ठ को चिह्नित करते हैं। यूनिकोड संपत्ति के संदर्भ में, यह एल, एम, एन, पी, एस या सीएफ गुणों के साथ सभी वर्णों को मेल करता है, इसके अलावा:

U + 061C

अरबी पत्र मार्क

U + 180E

मंगोलियाई स्वर विभाजक

U + 2066 - U + 2069

विभिन्न "अलग" है

[: प्रिंट:]

यह उसी वर्णों से मेल खाता है जैसे [: graph:] प्लस अंतरिक्ष वर्ण जो नियंत्रण नहीं हैं, अर्थात, Zs गुण वाले वर्ण।

[: Punct:]

यह उन सभी वर्णों से मेल खाता है जिनके पास यूनिकोड P (विराम चिह्न) गुण है, साथ ही वे वर्ण जिनके कोड अंक 128 से कम हैं, जिनके पास S (प्रतीक) संपत्ति है।

अन्य POSIX कक्षाएं अपरिवर्तित हैं, और 128 से कम कोड बिंदु वाले केवल वर्णों से मेल खाते हैं।

वर्ड बाउंड्रीज़ के लिए संगतता सुविधा

POSIX.2 आज्ञाकारी पुस्तकालय में जो 4.4BSD यूनिक्स में शामिल था, बदसूरत वाक्य रचना [[: <:]] और [[:>:]] का उपयोग "शब्द की शुरुआत" और "शब्द के अंत" के मिलान के लिए किया जाता है। PCRE इन वस्तुओं को निम्नानुसार मानता है:

[[: <:]]

\ b (? = \ w) में परिवर्तित हो जाता है

[[:>:]]

को \ b में बदल दिया जाता है

केवल इन सटीक चरित्र अनुक्रमों को मान्यता दी जाती है। एक अनुक्रम जैसे कि [[: <:] b] एक गैर मान्यता प्राप्त POSIX वर्ग के नाम के लिए त्रुटि भड़काता है। यह समर्थन पर्ल के साथ संगत नहीं है। यह अन्य वातावरणों से पलायन में मदद करने के लिए प्रदान किया जाता है, और किसी भी नए पैटर्न में सबसे अच्छा उपयोग नहीं किया जाता है। ध्यान दें कि एक शब्द के प्रारंभ और अंत में \ b का मिलान होता है (ऊपर "साधारण दावे" देखें), और एक पर्ल शैली के पैटर्न में पूर्ववर्ती या निम्न वर्ण सामान्य रूप से दिखाता है जो कि वांछित है, बिना उपयोग किए जाने वाले सिद्धांतों की आवश्यकता के ठीक POSIX व्यवहार देने के लिए ऊपर।

सीधी खड़ी रेखा

वर्टिकल बार कैरेक्टर का इस्तेमाल वैकल्पिक पैटर्न को अलग करने के लिए किया जाता है। उदाहरण के लिए, निम्नलिखित पैटर्न "गिल्बर्ट" या "सुलिवन" से मेल खाता है:

gilbert|sullivan

विकल्पों में से कोई भी संख्या दिखाई दे सकती है, और एक खाली विकल्प की अनुमति है (खाली स्ट्रिंग से मेल खाते हुए)। मिलान की प्रक्रिया प्रत्येक विकल्प को बारी-बारी से, बाएं से दाएं करने की कोशिश करती है, और जो पहले सफल होता है उसका उपयोग किया जाता है। यदि विकल्प एक सबपैटर्न के भीतर हैं (खंड में परिभाषित Subpatterns ), "सफल" का अर्थ है शेष मुख्य पैटर्न और उपपट्ट में वैकल्पिक मिलान।

आंतरिक विकल्प सेटिंग

पर्ल-संगत विकल्पों में से सेटिंग caseless , multiline , dotall , और extended पैटर्न के भीतर से पर्ल विकल्प के बीच संलग्न पत्र के अनुक्रम द्वारा बदला जा सकता "(?" और ")"। विकल्प पत्र निम्नानुसार हैं:

मैं
के लिये caseless
मीटर
के लिये multiline
रों
के लिये dotall
एक्स
के लिये extended

उदाहरण के लिए, (?im) सेटलेस, मल्टीलाइन मैचिंग। ये विकल्प एक हाइफ़न के साथ पत्र के पहले से भी परेशान हो सकते हैं। एक संयुक्त सेटिंग और अनसेटिंग जैसे (?im-sx) , जो सेट करता है caseless और multiline , जबकि असंगत dotall और extended , की भी अनुमति है। यदि एक पत्र हाइफ़न से पहले और बाद में दोनों में दिखाई देता है, तो विकल्प परेशान है।

PCRE विशिष्ट विकल्प dupnames , ungreedy , और extra क्रमशः पात्रों जम्मू, यू, और एक्स का उपयोग करके पर्ल-संगत विकल्प के रूप में एक ही तरीके से बदला जा सकता है।

जब इन विकल्पों में से एक परिवर्तन शीर्ष-स्तर पर होता है (जो कि सब-कॉन्टेंट कोष्ठकों के अंदर नहीं होता है), तो परिवर्तन शेष पैटर्न पर लागू होता है।

सबपैटर्न (अनुभाग देखें Subpatterns ) के भीतर एक विकल्प परिवर्तन केवल उप-भाग के उस हिस्से को प्रभावित करता है जो इसका अनुसरण करता है। इसलिए, निम्नलिखित मैच abc और abc और कोई अन्य स्ट्रिंग्स ( caseless उपयोग नहीं किया जाता है):

(a(?i)b)c

इस माध्यम से, पैटर्न के विभिन्न हिस्सों में अलग-अलग सेटिंग्स करने के लिए विकल्प बनाए जा सकते हैं। एक विकल्प में किए गए कोई भी परिवर्तन उसी उप-पथ के भीतर बाद की शाखाओं में चलते हैं। उदाहरण के लिए:

(a(?i)b|c)

"ab", "aB", "c" और "C" से मेल खाता है, हालांकि "C" से मिलान करते समय विकल्प सेटिंग से पहले पहली शाखा छोड़ दी जाती है। ऐसा इसलिए है क्योंकि विकल्प सेटिंग्स का प्रभाव संकलन समय पर होता है। अन्यथा कुछ अजीब व्यवहार होगा।

ध्यान दें

अन्य पीसीआर-विशिष्ट विकल्प आवेदन द्वारा निर्धारित किए जा सकते हैं जब संकलन या मिलान फ़ंक्शन कहा जाता है। कभी-कभी पैटर्न में विशेष प्रमुख अनुक्रम शामिल हो सकते हैं, जैसे (* CRLF), यह निर्धारित करने के लिए कि क्या सेट किया है या क्या डिफ़ॉल्ट है। विवरण अनुभाग में Newline Sequences पहले दिए गए हैं।

(* UTF8) और (* UCP) अग्रणी अनुक्रमों का उपयोग UTF और यूनिकोड संपत्ति मोड सेट करने के लिए किया जा सकता है। वे क्रमशः विकल्प unicode और सेटिंग के बराबर ucp हैं। (* UTF) अनुक्रम एक सामान्य संस्करण है जिसका उपयोग किसी भी लाइब्रेरी के साथ किया जा सकता है। हालांकि, एप्लिकेशन विकल्प सेट कर सकता है never_utf , जो (* UTF) अनुक्रमों के उपयोग को बंद कर देता है।

Subpatterns

उपपट्ट को कोष्ठक (गोल कोष्ठक) द्वारा सीमांकित किया जाता है, जिसे नेस्टेड किया जा सकता है। एक पैटर्न के एक हिस्से को एक उपपट्ट में बदलना दो काम करता है:

1।

यह विकल्पों के एक सेट का स्थानीयकरण करता है। उदाहरण के लिए, निम्नलिखित पैटर्न "मोतियाबिंद", "कैटरपिलर", या "कैट" से मेल खाता है

cat(aract|erpillar|)

कोष्ठक के बिना, यह "मोतियाबिंद", "इरपिलर", या एक रिक्त स्ट्रिंग से मेल खाता होगा।

2।

यह एक कैप्चरिंग सबपैटर्न के रूप में सबपैटर्न को सेट करता है। यानी, जब पूरा पैटर्न मैच करता है, तो सब्जेक्ट से मिलान करने वाले सब्जेक्ट स्ट्रिंग के उस हिस्से को कॉलर वैल्यू के माध्यम से वापस पास कर दिया जाता है run/3

ओपनिंग कोष्ठक को कैप्चरिंग सबपैटर्न के लिए नंबर प्राप्त करने के लिए बाएं से दाएं (1 से शुरू) में गिना जाता है। उदाहरण के लिए, यदि स्ट्रिंग "लाल राजा" का मिलान निम्नलिखित पैटर्न के विरुद्ध किया जाता है, तो पकड़े गए उपबंध "लाल राजा", "लाल" और "राजा" हैं, और क्रमशः 1, 2, और 3 गिने जाते हैं:

the ((red|white) (king|queen))

यह हमेशा सहायक नहीं होता है कि सादे कोष्ठक दो कार्यों को पूरा करते हैं। अक्सर एक कैप्चरिंग आवश्यकता के बिना एक ग्रुपिंग सबपैटर्न की आवश्यकता होती है। यदि एक उद्घाटन कोष्ठक एक प्रश्न चिह्न और एक बृहदान्त्र द्वारा पीछा किया जाता है, तो सबपैटर्न कोई कैप्चरिंग नहीं करता है, और किसी भी बाद कैप्चरिंग सबपैटर्न की संख्या की गणना करते समय गणना नहीं की जाती है। उदाहरण के लिए, यदि स्ट्रिंग "द व्हाइट क्वीन" का मिलान निम्न पैटर्न से किया जाता है, तो कैप्चर किए गए सबस्ट्रिंग "व्हाइट क्वीन" और "क्वीन" हैं, और इनकी संख्या 1 और 2 है:

the ((?:red|white) (king|queen))

सबपैटर्न पर कब्जा करने की अधिकतम संख्या 65535 है।

एक सुविधाजनक आशुलिपि के रूप में, यदि गैर-कैप्चरिंग सबपैटर्न की शुरुआत में किसी भी विकल्प की सेटिंग्स की आवश्यकता होती है, तो विकल्प पत्र "?" तथा ":"। इस प्रकार, निम्नलिखित दो पैटर्न तार के समान सेट से मेल खाते हैं:

(?i:saturday|sunday)
(?:(?i)saturday|sunday)

जैसा कि वैकल्पिक शाखाओं को बाएं से दाएं की कोशिश की जाती है, और जब तक उपपट्टी समाप्त नहीं हो जाती है तब तक विकल्प रीसेट नहीं किए जाते हैं, एक शाखा में एक विकल्प सेटिंग बाद की शाखाओं को प्रभावित करती है, इसलिए उपरोक्त पैटर्न "SUNDAY" और "शनिवार" दोनों से मेल खाते हैं।

डुप्लीकेट सबपैटर्न नंबर

पर्ल 5.10 ने एक ऐसी सुविधा शुरू की, जहां एक सबपैटर्न में प्रत्येक विकल्प अपने कैप्चरिंग कोष्ठक के लिए समान संख्याओं का उपयोग करता है। इस तरह के एक सबपैटर्न के साथ शुरू होता है (?| और वह स्वयं एक गैर-कैप्चरिंग सबपैटर्न है। उदाहरण के लिए, निम्नलिखित पैटर्न पर विचार करें:

(?|(Sat)ur|(Sun))day

जैसा कि दो विकल्प एक (?| समूह के अंदर हैं , कोष्ठक पर कब्जा करने के दोनों सेट एक गिने जाते हैं। इस प्रकार, जब पैटर्न मैच करता है, तो आप कैप्चर किए गए नंबरिंग नंबर पर देख सकते हैं, जो भी वैकल्पिक मिलान हो। यह निर्माण तब उपयोगी होता है जब आप किसी एक विकल्प पर एक हिस्से को पकड़ना चाहते हैं, लेकिन सभी को नहीं। एक (?| समूह के अंदर , कोष्ठक हमेशा की तरह क्रमांकित होते हैं, लेकिन प्रत्येक शाखा के प्रारंभ में संख्या को रीसेट कर दिया जाता है। किसी भी कैप्चरिंग कोष्ठक की संख्या जो किसी भी शाखा में उपयोग किए जाने वाले उच्चतम संख्या के बाद उपपट्ट का अनुसरण करती है। निम्नलिखित उदाहरण पर्ल दस्तावेज से है; नीचे दिखाए गए नंबरों की संख्या जिसमें बफर कैप्चर की गई सामग्री संग्रहीत है:

# before  ---------------branch-reset----------- after
/ ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
# 1            2         2  3        2     3     4

गिने हुए सबपैटर्न का एक बैक रेफरेंस सबसे हाल के मूल्य का उपयोग करता है जो किसी भी सबपैटर्न द्वारा उस संख्या के लिए निर्धारित किया जाता है। निम्नलिखित पैटर्न "abcabc" या "defdef" से मेल खाता है:

/(?|(abc)|(def))\1/

इसके विपरीत, गिने हुए सबपैटर्न के लिए एक सबरूटीन कॉल हमेशा दिए गए नंबर के साथ पैटर्न में पहले एक को संदर्भित करता है। निम्नलिखित पैटर्न "abcabc" या "defabc" से मेल खाता है:

/(?|(abc)|(def))(?1)/

यदि मिलान किए जा रहे किसी सबपैटर्न के लिए एक शर्त परीक्षण एक गैर-अद्वितीय संख्या को संदर्भित करता है, तो परीक्षण सही है यदि उस संख्या के किसी भी उप-समूह से मेल खाता है।

इस "शाखा रीसेट" सुविधा का उपयोग करने वाला एक वैकल्पिक तरीका है, अगले भाग में वर्णित के रूप में उपपट्टन्स नाम के डुप्लिकेट का उपयोग करना।

जिसका नाम सबपाटन्ट्स रखा गया है

कोष्ठकों को संख्या द्वारा कैप्चर करना सरल है, लेकिन जटिल नियमित अभिव्यक्तियों में संख्याओं पर नज़र रखना कठिन हो सकता है। इसके अलावा, यदि एक अभिव्यक्ति को संशोधित किया जाता है, तो संख्याएं बदल सकती हैं। इस कठिनाई में मदद करने के लिए, पीसीआरई, सबपैटर्न के नामकरण का समर्थन करता है। 5.10 रिलीज होने तक पर्ल में यह फीचर नहीं जोड़ा गया था। पहले पायथन की विशेषता थी, और पीसीआरई ने पायथन सिंटैक्स का उपयोग करके इसे 4.0 जारी किया। PCRE अब Perl और Python दोनों सिंटैक्स का समर्थन करता है। पर्ल अलग-अलग नामों से अलग-अलग पहचाने गए उप-केंद्रों की अनुमति देता है, लेकिन PCRE नहीं करता है।

पीसीआरई में, एक सबपैटर्न को तीन तरीकों में से एक में नाम दिया जा सकता है: (?<name>...) या के (?'name'...) रूप में पर्ल में, या (?P<name>...) पायथन में। पैटर्न के अन्य भागों से कोष्ठकों को कैप्चर करने के संदर्भ, जैसे कि संदर्भ, पुनरावृत्ति, और स्थितियां, नाम और संख्या के अनुसार बनाई जा सकती हैं।

नामों में 32 अल्फ़ान्यूमेरिक वर्ण और अंडरस्कोर शामिल हैं, लेकिन एक गैर-अंक से शुरू होना चाहिए। कोष्ठक पर कब्जा करने वाले नाम अभी भी संख्याओं के साथ-साथ नामों को भी आवंटित किए गए हैं, जैसे कि नाम मौजूद नहीं थे। capture विनिर्देश के run/3 नाम पर रखा गया उपयोग कर सकते हैं मूल्यों अगर वे नियमित अभिव्यक्ति में मौजूद हैं।

डिफ़ॉल्ट रूप से, एक नाम एक पैटर्न के भीतर अद्वितीय होना चाहिए, लेकिन dupnames संकलन समय पर विकल्प सेट करके इस बाधा को शांत किया जा सकता है । (डुप्लिकेट नाम हमेशा एक ही नंबर के साथ सबपैटर्न के लिए भी अनुमति दी जाती है, जिसे पिछले अनुभागों में वर्णित किया गया है।) डुप्लिकेट नाम उन पैटर्नों के लिए उपयोगी हो सकते हैं, जहां नामांकित कोष्ठक के केवल एक उदाहरण का मिलान हो सकता है। मान लीजिए कि आप किसी कार्यदिवस के नाम से मेल खाना चाहते हैं, या तो 3-अक्षर वाले संक्षिप्त नाम या पूर्ण नाम के रूप में, और दोनों ही मामलों में आप संक्षिप्त नाम निकालना चाहते हैं। निम्नलिखित पैटर्न (लाइन ब्रेक की अनदेखी) काम करता है:

(?<DN>Mon|Fri|Sun)(?:day)?|
(?<DN>Tue)(?:sday)?|
(?<DN>Wed)(?:nesday)?|
(?<DN>Thu)(?:rsday)?|
(?<DN>Sat)(?:urday)?

पांच कैप्चरिंग सबस्ट्रिंग हैं, लेकिन एक मैच के बाद केवल एक सेट किया जाता है। (इस समस्या को हल करने का एक वैकल्पिक तरीका "शाखा रीसेट" उपपट्ट का उपयोग करना है, जैसा कि पिछले भाग में वर्णित है।)

उपपट्टों को पकड़ने के लिए जो नाम अद्वितीय नहीं हैं, पहला मिलान घटना (विषय में बाएं से दाएं की ओर गिना जाता है) से लौटा दिया जाता है run/3 , यदि नाम बयान के values हिस्से में निर्दिष्ट है capture all_names कैप्चरिंग मूल्य उसी तरह से सभी के नाम से मेल खाता है।

ध्यान दें

आप एक ही नंबर के साथ दो उपपट्टों के बीच अंतर करने के लिए अलग-अलग नामों का उपयोग नहीं कर सकते, क्योंकि मिलान करते समय PCRE केवल संख्याओं का उपयोग करता है। इस कारण से, संकलित समय पर एक त्रुटि दी जाती है यदि एक ही नंबर के साथ अलग-अलग नाम सब-स्टैंट्स को निर्दिष्ट किए जाते हैं। हालाँकि, आप समान नाम को समान संख्या के साथ उपपट्टों में निर्दिष्ट कर सकते हैं, तब भी जब dupnames सेट नहीं किया गया हो।

दुहराव

पुनरावृत्ति क्वांटिफायर द्वारा निर्दिष्ट की जाती है, जो निम्नलिखित में से किसी भी वस्तु का अनुसरण कर सकता है:

  • एक शाब्दिक डेटा चरित्र
  • डॉट मेटाचैकर
  • The C C बच निकलने का क्रम
  • \ X बच क्रम
  • The R R अनुक्रम अनुक्रम
  • एक भागने जैसे कि \ d या \ pL जो एकल वर्ण से मेल खाता है
  • एक चरित्र वर्ग
  • एक पिछला संदर्भ (अगला भाग देखें)
  • एक संक्षिप्त उप-विषयक (अभिकथन सहित)
  • एक सबरटीन के लिए एक सबरूटीन कॉल (पुनरावर्ती या अन्यथा)

सामान्य पुनरावृत्ति क्वांटिफायर एक अल्पविराम द्वारा अलग किए गए घुंघराले कोष्ठक (ब्रेसिज़) में दो नंबर देकर न्यूनतम और अधिकतम अनुमत मैचों की संख्या निर्दिष्ट करता है। संख्या <65536 होनी चाहिए, और पहले को दूसरे से कम या बराबर होना चाहिए। उदाहरण के लिए, निम्नलिखित मैच "zz", "zzz", या "zzzz":

z{2,4}

अपने आप पर एक बंद कंस एक विशेष चरित्र नहीं है। यदि दूसरी संख्या छोड़ दी जाती है, लेकिन अल्पविराम मौजूद है, कोई ऊपरी सीमा नहीं है। यदि दूसरी संख्या और अल्पविराम दोनों को छोड़ दिया जाता है, तो क्वांटिफायर आवश्यक मिलानों की सटीक संख्या निर्दिष्ट करता है। इस प्रकार, निम्नलिखित कम से कम तीन क्रमिक स्वरों से मेल खाते हैं, लेकिन कई और मेल कर सकते हैं:

[aeiou]{3,}

निम्नलिखित आठ अंकों से मेल खाते हैं:

\d{8}

एक उद्घाटन घुंघराले ब्रैकेट जो एक ऐसी स्थिति में दिखाई देता है, जहां एक क्वांटिफायर की अनुमति नहीं है, या एक जो एक क्वांटिफायर के सिंटैक्स से मेल नहीं खाता है, को शाब्दिक चरित्र के रूप में लिया जाता है। उदाहरण के लिए, {, 6} एक मात्रात्मक नहीं है, बल्कि चार वर्णों का शाब्दिक तार है।

यूनिकोड मोड में, क्वांटिफायर व्यक्तिगत डेटा इकाइयों के बजाय पात्रों पर लागू होते हैं। इस प्रकार, उदाहरण के लिए, \ x {100} {2} दो वर्णों से मेल खाता है, जिनमें से प्रत्येक को UTF-8 स्ट्रिंग में 2-बाइट अनुक्रम द्वारा दर्शाया गया है। इसी तरह, \ X {3} तीन यूनिकोड विस्तारित ग्रैफेम समूहों से मेल खाता है, जिनमें से प्रत्येक लंबे समय तक कई डेटा इकाइयां हो सकती हैं (और वे अलग-अलग लंबाई के हो सकते हैं)।

क्वांटिफ़ायर {0} की अनुमति दी जाती है, जिससे अभिव्यक्ति का व्यवहार होता है जैसे कि पिछले आइटम और क्वांटिफायर मौजूद नहीं थे। यह सबपैटर्न के लिए उपयोगी हो सकता है जिन्हें पैटर्न में कहीं और से सबरूटीन के रूप में संदर्भित किया जाता है (लेकिन अनुभाग भी देखें Defining Subpatterns for Use by Reference Only )। सबपैटर्न के अलावा अन्य आइटम जिनके पास {0} क्वांटिफायर है, उन्हें संकलित पैटर्न से छोड़ा गया है।

सुविधा के लिए, तीन सबसे आम क्वांटिफ़ायर में एकल-वर्ण संक्षिप्तियाँ हैं:

*
{0,} के बराबर
+
{1,} के बराबर
?
{0,1} के बराबर

अनंत लूप्स का निर्माण एक उपपट्ट का अनुसरण करके किया जा सकता है जो किसी भी मात्रा के साथ कोई वर्ण नहीं मिला सकता है जिसकी कोई ऊपरी सीमा नहीं है, उदाहरण के लिए:

(a?)*

पर्ल और पीसीआरई के पहले संस्करण ऐसे पैटर्न के लिए संकलन समय पर एक त्रुटि देते थे। हालांकि, ऐसे मामले हैं जहां यह उपयोगी हो सकता है, ऐसे पैटर्न अब स्वीकार किए जाते हैं। हालाँकि, अगर किसी भी तरह के सबपैटर्न के पुनरावृत्ति का कोई वर्ण नहीं होता है, तो लूप को जबरन तोड़ दिया जाता है।

डिफ़ॉल्ट रूप से, क्वांटिफायर "लालची" होते हैं, अर्थात, वे यथासंभव अधिक से अधिक (अनुमत समय की अधिकतम संख्या तक) मेल खाते हैं, बिना शेष पैटर्न विफल हो जाते हैं। जहाँ यह समस्या देता है, उसका क्लासिक उदाहरण C कार्यक्रमों में टिप्पणियों का मिलान करने की कोशिश में है। ये / * और * / के बीच दिखाई देते हैं। टिप्पणी के भीतर, व्यक्तिगत * और / वर्ण दिखाई दे सकते हैं। पैटर्न लागू करके सी टिप्पणियों से मिलान करने का प्रयास

/\*.*\*/

स्ट्रिंग के लिए

/* first comment */  not comment  /* second comment */

विफल रहता है, क्योंकि यह पूरे स्ट्रिंग के लालच के कारण मेल खाता है। * आइटम।

हालाँकि, अगर किसी क्वॉन्टिफायर का प्रश्न चिन्ह लग जाता है, तो यह लालची होना बंद हो जाता है, और इसके बजाय न्यूनतम संभव संख्या से मेल खाता है, इसलिए निम्न पैटर्न सी टिप्पणियों के साथ सही काम करता है:

/\*.*?\*/

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

\d??\d

जो वरीयता के अनुसार एक अंक से मेल खाता है, लेकिन शेष पैटर्न के मिलान का एकमात्र तरीका है तो दो से मिलान कर सकता है।

यदि विकल्प ungreedy सेट किया जाता है (एक विकल्प जो पर्ल में उपलब्ध नहीं है), तो क्वांटिफायर डिफ़ॉल्ट रूप से लालची नहीं होते हैं, लेकिन व्यक्तिगत लोगों को एक प्रश्न चिह्न के साथ पालन करके लालची बनाया जा सकता है। यही है, यह डिफ़ॉल्ट व्यवहार को निष्क्रिय करता है।

जब एक कोष्ठक उपपट्ट को न्यूनतम पुनरावृत्ति गणना के साथ परिमाणित किया जाता है जो कि> 1 या सीमित अधिकतम के साथ, संकलित पैटर्न के लिए न्यूनतम या अधिकतम के आकार के अनुपात में अधिक मेमोरी की आवश्यकता होती है।

एक पैटर्न * या के साथ शुरू होता है। यदि। {0,} और विकल्प dotall (पर्ल विकल्प के बराबर /s ) सेट कर दिया जाता है, इस प्रकार डॉट नई-पंक्तियों से मेल करने के लिए अनुमति देता है, पैटर्न परोक्ष लंगर डाले है, इस प्रकार, क्योंकि जो कुछ भी इस विषय में हर चरित्र स्थिति के खिलाफ मुकदमा किया जाता है स्ट्रिंग। इसलिए, पहले के बाद किसी भी स्थिति में समग्र मैच को पुनः प्राप्त करने का कोई मतलब नहीं है। पीसीआरई आमतौर पर इस तरह के एक पैटर्न का इलाज करता है जैसे कि यह पहले से एक था।

ऐसे मामलों में जहां यह ज्ञात है कि विषय स्ट्रिंग में कोई नया अंक नहीं है, यह dotall स्पष्ट रूप से एंकरिंग को इंगित करने के लिए ^ इस अनुकूलन को प्राप्त करने या वैकल्पिक रूप से ^ का उपयोग करने के लिए सेटिंग के लायक है ।

हालाँकि, कुछ ऐसे मामले हैं जहाँ अनुकूलन का उपयोग नहीं किया जा सकता है। जब। * कोष्ठकों पर कब्जा करने के अंदर होता है जो पैटर्न में कहीं और एक संदर्भ के पीछे होते हैं, तो प्रारंभ में एक मैच विफल हो सकता है जहां बाद में एक सफल होता है। उदाहरण के लिए विचार करें:

(.*)abc\1

यदि विषय "xyz123abc123" है, तो मैच प्वाइंट चौथा चरित्र है। इसलिए, इस तरह के एक पैटर्न निहित नहीं है।

एक अन्य मामला जहां निहित एंकरिंग लागू नहीं है, जब प्रमुख है। * एक परमाणु समूह के अंदर है। एक बार फिर, शुरू में एक मैच विफल हो सकता है जहां बाद में एक सफल होता है। निम्नलिखित पैटर्न पर विचार करें:

(?>.*?a)b

यह विषय "आब" में "एब" से मेल खाता है। बैकट्रैकिंग कंट्रोल वर्ब्स (* PRUNE) और (* SKIP) का उपयोग भी इस अनुकूलन को अक्षम करता है।

जब एक कैप्चरिंग सबपैटर्न दोहराया जाता है, तो कैप्चर किया गया मान अंतिम पुनरावृत्ति से मेल खाने वाले सबस्ट्रिंग होता है। उदाहरण के लिए, के बाद

(tweedle[dume]{3}\s*)+

"tweedledum tweedledee" से मेल खाता है, पकड़े गए विकल्प का मान "tweedledee" है। हालाँकि, यदि उप-कैप्चरिंग नेस्टेड हैं, तो संबंधित कैप्चर किए गए मान पिछले पुनरावृत्तियों में सेट किए जा सकते हैं। उदाहरण के लिए, के बाद

/(a|(b))+/

"एबा" से मेल खाता है, दूसरे कैप्चर किए गए सबस्ट्रिंग का मान "बी" है।

एटॉमिक ग्रुपिंग और पॉजेसिव क्वांटिफायर्स

अधिकतमकरण ("लालची") और कम से कम ("लालची" या "आलसी") दोहराव के साथ, सामान्य रूप से बार-बार दोहराए जाने वाले आइटम को देखने के लिए पुनर्मूल्यांकन का कारण बनता है कि क्या देखने के लिए विफलता का कारण बनता है कि क्या विभिन्न संख्या में दोहराव शेष पैटर्न को मिलान करने की अनुमति देता है। कभी-कभी इसे रोकने के लिए उपयोगी होता है, या तो मैच की प्रकृति को बदलने के लिए, या इसे पहले की तुलना में विफल होने का कारण बन सकता है अन्यथा, जब पैटर्न का लेखक जानता है कि ले जाने का कोई मतलब नहीं है।

उदाहरण के लिए, निम्न विषय पंक्ति पर लागू होने पर पैटर्न \ d + foo:

123456bar

सभी छह अंकों के मिलान के बाद और फिर "फू" से मिलान करने में विफल होने पर, मिलान करने वाले की सामान्य क्रिया केवल आइटम / डी + से पांच अंकों के मिलान के साथ फिर से प्रयास करना है, और फिर चार के साथ, और इसी तरह अंततः विफल होने से पहले। "एटॉमिक ग्रुपिंग" (जेफरी फ्रीडल की पुस्तक से लिया गया एक शब्द) यह निर्दिष्ट करने के लिए साधन प्रदान करता है कि एक बार एक सबपैटर्न मिलान हो गया है, इस तरह से इसका पुनर्मूल्यांकन नहीं किया जाना है।

यदि पिछले उदाहरण के लिए परमाणु समूह का उपयोग किया जाता है, तो पहली बार "फू" से मिलान करने में विफल होने पर मैचर तुरंत छोड़ देता है। संकेतन एक प्रकार का विशेष कोष्ठक है, जिसकी शुरुआत (?> निम्न उदाहरण से होती है:

(?>\d+)foo

इस तरह के कोष्ठक पैटर्न का एक हिस्सा "लॉक अप" करता है जिसमें एक बार यह मेल खाता है, और पैटर्न में आगे की विफलता को इसमें पीछे जाने से रोका जाता है। बैकट्रैकिंग इसे पिछले सामानों तक ले जाता है, हालांकि, सामान्य रूप से काम करता है।

एक वैकल्पिक विवरण यह है कि इस प्रकार का एक उप-अक्षर पात्रों के स्ट्रिंग से मेल खाता है जो एक समान स्टैंडअलोन पैटर्न से मेल खाता है, यदि विषय स्ट्रिंग में वर्तमान बिंदु पर लंगर डाला गया है।

परमाणु समूहीकरण उप-समूह उप-समूहों को कैप्चर नहीं कर रहे हैं। उपरोक्त उदाहरण जैसे सरल मामलों को एक अधिकतम दोहराव के रूप में माना जा सकता है जो इसे सब कुछ निगल सकता है। तो, जबकि दोनों \ d + और \ d +? शेष पैटर्न मैच बनाने के लिए वे जितने अंकों से मेल खाते हैं, उन्हें समायोजित करने के लिए तैयार हैं, (?>\d+) केवल अंकों के एक पूरे अनुक्रम से मेल खा सकते हैं।

सामान्य रूप से परमाणु समूहों में कोई भी जटिल उप-समूह हो सकता है, और इसे नस्ट किया जा सकता है। हालाँकि, जब एक परमाणु समूह के लिए उप-समूह केवल एक बार-बार दोहराई जाने वाली वस्तु है, जैसा कि ऊपर दिए गए उदाहरण में, एक "साधारण मात्रा" कहा जाता है। इसमें क्वांटिफायर के बाद एक अतिरिक्त + वर्ण होता है। इस अंकन का उपयोग करते हुए, पिछले उदाहरण को फिर से लिखा जा सकता है

\d++foo

ध्यान दें कि एक सम्पूर्ण समूह के साथ एक गुणात्मक परिमाणक का उपयोग किया जा सकता है:

(abc|xyz){2,3}+

संभावित मात्रात्मक हमेशा लालची होते हैं; विकल्प की सेटिंग ungreedy को नजरअंदाज कर दिया जाता है। वे एक परमाणु समूह के सरल रूपों के लिए एक सुविधाजनक संकेतन हैं। हालाँकि, एक मात्रात्मक परिमाणक और समान परमाणु समूह के अर्थ में कोई अंतर नहीं है, लेकिन एक प्रदर्शन अंतर हो सकता है; अधिकारवादी क्वांटिफ़ायर शायद थोड़े तेज़ होते हैं।

अधिकारपूर्ण क्वांटिफायर सिंटैक्स पर्ल 5.8 सिंटैक्स का विस्तार है। जेफरी फ्रिडल ने अपनी पुस्तक के पहले संस्करण में विचार (और नाम) की उत्पत्ति की। माइक मैकक्लोस्की ने इसे पसंद किया, इसलिए जब उन्होंने सन जावा पैकेज बनाया, तब इसे लागू किया और पीसीआरई ने इसे वहां से कॉपी किया। अंततः 5.10 को रिलीज के समय इसने पर्ल में अपना रास्ता ढूंढ लिया।

पीसीआरई का एक अनुकूलन है जो कुछ सरल पैटर्न निर्माणों को "स्वचालित रूप से" करता है। उदाहरण के लिए, अनुक्रम A + B को A ++ B के रूप में माना जाता है, क्योंकि A का अनुक्रम अनुक्रम में पीछे जाने का कोई मतलब नहीं है, जब B का अनुसरण करना चाहिए।

जब एक पैटर्न में एक सबपेटर्न के अंदर एक असीमित दोहराव होता है जिसे खुद कई बार असीमित संख्या में दोहराया जा सकता है, तो एक परमाणु समूह का उपयोग कुछ विफल मैचों से लंबे समय तक बचने का एकमात्र तरीका है। पैटर्न

(\D+|<\d+>)*[!?]

उन असीमित संख्याओं से मेल खाता है जो या तो गैर-अंकों से युक्त होते हैं, या <> में संलग्न अंक, इसके बाद! या? जब यह मेल खाता है, तो यह जल्दी से चलता है। हालांकि, अगर इसे लागू किया जाता है

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

विफलता की रिपोर्ट करने से पहले एक लंबा समय लगता है। ऐसा इसलिए है क्योंकि स्ट्रिंग को आंतरिक \ D + दोहराने और बाहरी * दोहराने के बीच कई तरीकों से विभाजित किया जा सकता है, और सभी की कोशिश की जानी चाहिए। (उदाहरण अंत में एकल चरित्र के बजाय [[?] का उपयोग करता है, क्योंकि पीसीआरई और पर्ल दोनों में एक अनुकूलन होता है जो एकल चरित्र का उपयोग करने पर तेजी से विफलता की अनुमति देता है। वे पिछले एकल वर्ण को याद करते हैं जो एक मैच के लिए आवश्यक है। और यह स्ट्रिंग में मौजूद नहीं होने पर जल्दी विफल हो जाता है।) यदि पैटर्न को बदल दिया जाता है, ताकि वह परमाणु समूह का उपयोग करे, तो निम्न की तरह, गैर-अंकों के अनुक्रमों को तोड़ा नहीं जा सकता है, और विफलता जल्दी होती है:

((?>\D+)|<\d+>)*[!?]

बैक सन्दर्भ

एक वर्ण वर्ग के बाहर, एक बैकस्लैश, जिसके बाद एक अंक> 0 (और संभवतः आगे के अंक) एक कैप्चरिंग सबपैटर्न का एक पिछला संदर्भ है (जो कि इसके बाईं ओर है) पैटर्न में, बशर्ते कि पिछले कई कैप्चरिंग कोष्ठक हो। ।

हालाँकि, यदि बैकस्लैश के बाद दशमलव संख्या <10 है, तो इसे हमेशा एक बैक रेफ़रेंस के रूप में लिया जाता है, और केवल एक त्रुटि का कारण बनता है यदि पूरे पैटर्न में बाएं कोष्ठक को कैप्चर करने वाले कई नहीं हैं। यही है, जिन संदर्भों को संदर्भित किया जाता है, उन्हें संख्याओं के संदर्भ के बाईं ओर होने की आवश्यकता नहीं होती है <10. इस प्रकार का "आगे पीछे संदर्भ" एक पुनरावृत्ति में शामिल होने और सही करने के लिए उप-समूह में भाग लेने पर समझ में आ सकता है। पहले पुनरावृत्ति।

एक उप-समूह के लिए एक संख्यात्मक "आगे पीछे संदर्भ" होना संभव नहीं है, जिसकी संख्या इस वाक्यविन्यास का उपयोग करके 10 या अधिक है, जैसे कि अनुक्रम 50 \ _ को ऑक्टल में परिभाषित वर्ण के रूप में व्याख्या किया गया है। बैकस्लैश के बाद अंकों की हैंडलिंग के अधिक विवरण के लिए, Non-Printing Characters पहले अनुभाग देखें । जब कोष्ठक का उपयोग किया जाता है तो ऐसी कोई समस्या नहीं है। किसी भी सबपैटर्न का बैक रेफरेंस नामांकित कोष्ठक (नीचे देखें) का उपयोग करना संभव है।

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

(ring), \1
(ring), \g1
(ring), \g{1}

एक अहस्ताक्षरित संख्या अस्पष्टता के बिना एक पूर्ण संदर्भ निर्दिष्ट करती है जो पुराने सिंटैक्स में मौजूद है। यह तब भी उपयोगी है जब शाब्दिक अंक संदर्भ का पालन करते हैं। एक नकारात्मक संख्या एक सापेक्ष संदर्भ है। निम्नलिखित उदाहरण पर विचार करें:

(abc(def)ghi)\g{-1}

अनुक्रम \ g {-1} \ g से पहले सबसे हाल ही में उपपट्ट पर कब्जा करने के लिए एक संदर्भ है, अर्थात, यह इस उदाहरण में \ 2 के बराबर है। इसी तरह, \ g {-2} \ _ के बराबर होगा। सापेक्ष संदर्भों का उपयोग लंबे पैटर्न में सहायक हो सकता है, और उन पैटर्नों में भी हो सकता है जो खंडों को स्वयं के संदर्भ में जोड़कर बनाए जाते हैं।

एक बैक रेफरेंस मिलान करता है जो भी वर्तमान विषय स्ट्रिंग में कैप्चरिंग सबपैटर्न से मेल खाता है, बल्कि सबपैटर्न से मेल खाते हुए कुछ भी करने के बजाय (अनुभाग Subpattern as Subroutines ऐसा करने का एक तरीका बताता है)। तो, निम्न पैटर्न "समझदारी और संवेदनशीलता" और "प्रतिक्रिया और जिम्मेदारी" से मेल खाता है, लेकिन "भावना और जिम्मेदारी" नहीं:

(sens|respons)e and \1ibility

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

((?i)rah)\s+\1

नामित उपपात्रों के संदर्भों को वापस लिखने के कई अलग-अलग तरीके हैं। .NET सिंटैक्स \k{name} और पर्ल सिंटैक्स \k<name> या \k'name' समर्थित हैं, जैसा कि पायथन सिंटैक्स है (?P=name) । पर्ल 5.10 में यूनिफाइड बैक रेफरेंस सिंटैक्स, जिसमें संख्यात्मक और नामित संदर्भ दोनों के लिए इस्तेमाल किया जा सकता है, भी समर्थित है। पिछले उदाहरण को निम्नलिखित तरीकों से फिर से लिखा जा सकता है:

(?<p1>(?i)rah)\s+\k<p1>
(?'p1'(?i)rah)\s+\k{p1}
(?P<p1>(?i)rah)\s+(?P=p1)
(?<p1>(?i)rah)\s+\g{p1}

एक उपपट्ट जिसे नाम से संदर्भित किया जाता है, वह संदर्भ के पहले या बाद के पैटर्न में दिखाई दे सकता है।

एक ही उपपट्ट के एक से अधिक बैक रेफरेंस हो सकते हैं। यदि किसी विशेष मैच में एक सबपैटर्न का उपयोग नहीं किया गया है, तो इसका कोई भी संदर्भ हमेशा विफल रहता है। उदाहरण के लिए, निम्न पैटर्न हमेशा विफल रहता है अगर यह "bc" के बजाय "a" से मेल खाने लगे:

(a|(bc))\2

जैसा कि पैटर्न में कई कैप्चरिंग कोष्ठक हो सकते हैं, बैकस्लैश का अनुसरण करने वाले सभी अंक संभावित बैक संदर्भ संख्या के भाग के रूप में लिए जाते हैं। यदि पैटर्न अंकों के चरित्र के साथ जारी रहता है, तो पीछे के संदर्भ को समाप्त करने के लिए कुछ सीमांकक का उपयोग किया जाना चाहिए। यदि विकल्प extended सेट किया गया है, तो यह व्हाट्सएप हो सकता है। अन्यथा एक खाली टिप्पणी (अनुभाग देखें Comments ) का उपयोग किया जा सकता है।

पुनरावर्ती वापस संदर्भ

कोष्ठक के अंदर होने वाला एक बैक रेफ़र जो इसे संदर्भित करता है जब सबपैटर्न का पहली बार उपयोग किया जाता है, तो, उदाहरण के लिए, (a \ 1) कभी मेल नहीं खाता। हालांकि, इस तरह के संदर्भ दोहराया उपपट्टियों के अंदर उपयोगी हो सकते हैं। उदाहरण के लिए, निम्नलिखित पैटर्न "a" s और "aba", "ababbaa" की किसी भी संख्या से मेल खाता है, और इस तरह से:

(a|b\1)+

सबपैटर्न के प्रत्येक पुनरावृत्ति पर, पिछला संदर्भ पिछले पुनरावृत्ति के अनुरूप वर्ण स्ट्रिंग से मेल खाता है। इसे काम करने के लिए, पैटर्न ऐसा होना चाहिए कि पहले पुनरावृत्ति को पीछे के संदर्भ से मेल खाने की आवश्यकता न हो। यह वैकल्पिक उपयोग करके किया जा सकता है, जैसा कि ऊपर के उदाहरण में, या एक शून्य की न्यूनतम मात्रा के साथ।

इस प्रकार के पीछे के संदर्भ उस समूह का कारण बनते हैं जिसे वे परमाणु समूह के रूप में माना जाता है। एक बार पूरे समूह का मिलान हो जाने के बाद, बाद की मिलान विफलता समूह के बीच में पीछे नहीं जा सकती।

इस प्रकार के दावे

एक मुखर वर्तमान मिलान बिंदु का अनुसरण या पूर्ववर्ती पात्रों पर एक परीक्षण है जो किसी भी वर्ण का उपभोग नहीं करता है। सरल कथनों को \ b, \ B, \ A, \ G, \ Z, \ z, ^, और $ के रूप में कोडित किया गया है और पिछले अनुभागों में वर्णित हैं।

अधिक जटिल अभिकर्मकों को उप-समूह के रूप में कोडित किया जाता है। दो प्रकार हैं: वे जो विषय स्ट्रिंग में वर्तमान स्थिति से आगे देखते हैं, और जो इसके पीछे दिखते हैं। एक सामान्य उप-पथ का मिलान सामान्य तरीके से किया जाता है, सिवाय इसके कि यह वर्तमान मिलान स्थिति को बदलने का कारण नहीं बनता है।

अभिकथन subpatterns, subpatterns पर कब्जा नहीं कर रहे हैं। यदि इस तरह के दावे में इसके भीतर उपपट्टियों को कैप्चर करना शामिल है, तो इन्हें पूरे पैटर्न में कैप्चरिंग सबपैटर्न की संख्या के प्रयोजनों के लिए गिना जाता है। हालांकि, कैप्चरिंग का स्थान केवल सकारात्मक अभिक्रिया के लिए किया जाता है। (कभी-कभी, लेकिन हमेशा नहीं, नकारात्मक धारणाओं में कैप्चरिंग करता है।)

चेतावनी

यदि एक या अधिक उप-कैप्चरिंग वाले एक सकारात्मक अभिक्रिया सफल हो जाती है, लेकिन बाद में पैटर्न में मिलान करने में विफलता इस कारण से पीछे हट जाती है, तो मुखर के भीतर के कैप्चर केवल तभी सेट किए जाते हैं जब कोई उच्च संख्या में कैप्चर पहले से सेट न हों। यह दुर्भाग्य से, वर्तमान कार्यान्वयन की एक मौलिक सीमा है, और जैसा कि PCRE1 अब केवल रखरखाव की स्थिति में है, यह कभी भी बदलने की संभावना नहीं है।

पर्ल के साथ संगतता के लिए, अभिकथन सबपैटर्न को दोहराया जा सकता है। हालांकि, यह कई बार एक ही बात का दावा करने के लिए कोई मतलब नहीं है, कोष्ठक पर कब्जा करने का दुष्प्रभाव कभी-कभी उपयोगी हो सकता है। व्यवहार में, केवल तीन मामले हैं:

  • यदि क्वांटिफायर {0} है, तो मिलान के दौरान दावे का पालन कभी नहीं किया जाता है। हालांकि, इसमें आंतरिक कैप्चरिंग कोष्ठक समूह हो सकते हैं जो सबरूटीन तंत्र के माध्यम से कहीं और से बुलाए जाते हैं।

  • यदि क्वांटिफायर {0, n} है, जहां n> 0 है, तो यह माना जाता है कि यह {0,1} था। रनटाइम के दौरान, शेष पैटर्न मैच की पुष्टि के साथ और उसके बिना करने की कोशिश की जाती है, ऑर्डर क्वांटिफायर के लालच पर निर्भर करता है।

  • यदि न्यूनतम पुनरावृत्ति> 0 है, तो क्वांटिफायर की अनदेखी की जाती है। जब मिलान के दौरान सामना किया जाता है तो केवल एक बार ही आज्ञापालन किया जाता है।

लाहहैड जोर

लुकहेड अभिकथनों की शुरुआत (? = सकारात्मक अभिकथनों के लिए होती है और (! नकारात्मक अभिकथनों के लिए)। उदाहरण के लिए, निम्नलिखित शब्द अर्धविराम के बाद आने वाले शब्द से मेल खाता है, लेकिन अर्धविराम को मैच में शामिल नहीं करता है:

\w+(?=;)

निम्नलिखित "फू" की किसी भी घटना से मेल खाता है जिसका "बार" द्वारा पालन नहीं किया जाता है:

foo(?!bar)

ध्यान दें कि स्पष्ट रूप से समान पैटर्न

(?!foo)bar

"बार" की एक घटना नहीं मिलती है जो "फू" के अलावा किसी अन्य चीज से पहले होती है। यह "बार" जो भी हो, की किसी भी घटना को पाता है, क्योंकि जब अगले तीन वर्ण "बार" होते हैं तो हमेशा ((फू!)) सत्य होता है। अन्य प्रभाव को प्राप्त करने के लिए एक खोज के दावे की आवश्यकता है।

यदि आप किसी बिंदु पर एक मिलान विफलता को एक पैटर्न में मजबूर करना चाहते हैं, तो ऐसा करने का सबसे सुविधाजनक तरीका हमेशा (!) के साथ है, जैसा कि एक खाली स्ट्रिंग हमेशा मेल खाती है। तो, एक जोर देने की आवश्यकता है कि खाली स्ट्रिंग नहीं होना चाहिए हमेशा विफल होना चाहिए। बैकट्रैकिंग कंट्रोल वर्ब (* FAIL) या (* F) एक ((!) का पर्याय है)।

दिखावे के दावे

सकारात्मक अभिकथन के साथ शुरू होता है (और? = सकारात्मक अभिकथन के लिए और! <!) नकारात्मक अभिकथन के लिए। उदाहरण के लिए, निम्नलिखित "बार" की एक घटना पाता है जो "फू" से पहले नहीं है:

(?<!foo)bar

एक खोज के दावे की सामग्री इस तरह से प्रतिबंधित है कि इसके सभी तार एक निश्चित लंबाई के होने चाहिए। हालांकि, अगर कई शीर्ष-स्तरीय विकल्प हैं, तो वे सभी के लिए एक ही निश्चित लंबाई नहीं है। इस प्रकार, निम्नलिखित की अनुमति है:

(?<=bullock|donkey)

निम्नलिखित संकलन समय पर एक त्रुटि का कारण बनता है:

(?<!dogs?|cats?)

विभिन्न लंबाई के तार से मेल खाने वाली शाखाओं को केवल एक खोज के शीर्ष स्तर पर अनुमति दी जाती है। यह पर्ल के साथ तुलना में एक विस्तार है, जिसके लिए सभी शाखाओं को स्ट्रिंग की समान लंबाई से मेल खाना चाहिए। निम्नलिखित जैसे अनुमति की अनुमति नहीं है, क्योंकि इसकी एकल शीर्ष-स्तरीय शाखा दो अलग-अलग लंबाई से मेल खा सकती है:

(?<=ab(c|de))

हालाँकि, यह PCRE के लिए स्वीकार्य है यदि दो शीर्ष-स्तरीय शाखाओं का उपयोग करने के लिए फिर से लिखा जाए:

(?<=abc|abde)

कभी-कभी भागने के क्रम \ K (ऊपर देखें) का उपयोग लुकबाइंड मुखबिरी के बजाय तय-लंबाई के प्रतिबंध के लिए किया जा सकता है।

प्रत्येक विकल्प के लिए, वर्तमान स्थिति को अस्थायी रूप से निर्धारित लंबाई से अस्थायी रूप से वापस ले जाने और फिर मिलान करने का प्रयास करने के लिए, लुकअप एश्योरेंस का कार्यान्वयन है। यदि वर्तमान स्थिति से पहले अपर्याप्त अक्षर हैं, तो अभिकथन विफल हो जाता है।

UTF मोड में, PCRE \ C से बचने की अनुमति नहीं देता (जो एक UTF मोड में भी एकल डेटा इकाई से मेल खाता है) मुखरता में दिखाई देता है, क्योंकि यह लुकबाइंड की लंबाई की गणना करना असंभव बनाता है। \ X और \ R बचता है, जो डेटा इकाइयों की विभिन्न संख्याओं से मेल खा सकता है, या तो अनुमति नहीं है।

"सबरूटीन" कॉल (नीचे देखें), जैसे कि (? 2) या (? और एक्स), लुकाइबाइंड में अनुमति दी जाती है, जब तक कि उप-प्लेटिन तय लंबाई के स्ट्रिंग से मेल खाती है। पुनरावृत्ति, हालांकि, समर्थित नहीं है।

विषयवार तार के अंत में निश्चित लंबाई के तार के कुशल मिलान को निर्दिष्ट करने के लिए परिमाणात्मक मात्रात्मक का उपयोग दिखावे के साथ किया जा सकता है। मेल न खाने वाले लंबे स्ट्रिंग पर लागू होने पर निम्नलिखित सरल पैटर्न पर विचार करें:

abcd$

जैसा कि मिलान बाएं से दाएं की ओर बढ़ता है, पीसीआरई विषय में प्रत्येक "ए" की तलाश करता है और फिर देखता है कि क्या शेष पैटर्न से मेल खाता है। यदि पैटर्न के रूप में निर्दिष्ट किया गया है

^.*abcd$

प्रारंभिक। * पहली बार में पूरे स्ट्रिंग से मेल खाता है। हालाँकि, जब यह विफल हो जाता है (जैसा कि "a" का अनुसरण नहीं होता है), तो यह सभी लेकिन अंतिम वर्ण, फिर सभी लेकिन अंतिम दो वर्णों, और इसी तरह मेल करने के लिए पीछे हट जाता है। एक बार फिर "ए" की खोज संपूर्ण स्ट्रिंग को दाईं से बाईं ओर कवर करती है, इसलिए हम बेहतर बंद नहीं हैं। हालांकि, अगर पैटर्न के रूप में लिखा है

^.*+(?<=abcd)

के लिए कोई backtracking नहीं हो सकता है। * + आइटम; यह केवल पूरे स्ट्रिंग से मेल खा सकता है। अंतिम चार वर्णों पर एक ही परीक्षण के बाद की तलाश में यदि यह विफल रहता है, तो मैच तुरंत विफल हो जाता है। लंबे तार के लिए, यह दृष्टिकोण प्रसंस्करण समय के लिए एक महत्वपूर्ण अंतर बनाता है।

एकाधिक कथनों का उपयोग करना

उत्तराधिकार में कई दावे (किसी भी प्रकार के) हो सकते हैं। उदाहरण के लिए, निम्नलिखित मैच "फू" तीन अंकों से पहले हैं जो "999" नहीं हैं:

(?<=\d{3})(?<!999)foo

ध्यान दें कि प्रत्येक स्ट्रिंग को विषय स्ट्रिंग में एक ही बिंदु पर स्वतंत्र रूप से लागू किया जाता है। पहले एक जाँच होती है कि पिछले तीन वर्ण सभी अंक हैं, और फिर एक जाँच है कि वही तीन वर्ण "999" नहीं हैं। यह पैटर्न छह वर्णों से पहले "फू" से मेल नहीं खाता है, जिनमें से पहले अंक हैं और जिनमें से अंतिम तीन "999" नहीं हैं। उदाहरण के लिए, यह "123abcfoo" से मेल नहीं खाता है। ऐसा करने के लिए एक पैटर्न निम्नलिखित है:

(?<=\d{3}...)(?<!999)foo

इस बार पहला अभिकथन पूर्ववर्ती छह वर्णों को देखता है, जाँचता है कि पहले तीन अंक हैं, और फिर दूसरा जोर यह जाँचता है कि पूर्ववर्ती तीन वर्ण "999" नहीं हैं।

किसी भी संयोजन में जोर दिया जा सकता है। उदाहरण के लिए, निम्नलिखित "बाज़" की घटना से मेल खाता है जो "बार" से पहले होता है, जो "फू" से पहले नहीं होता है:

(?<=(?<!foo)bar)baz

निम्नलिखित पैटर्न "फू" तीन अंकों और किसी भी तीन वर्णों से मेल खाता है जो "999" नहीं हैं।

(?<=\d{3}(?!999)...)foo

सशर्त उपपरिवार

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

(?(condition)yes-pattern)
(?(condition)yes-pattern|no-pattern)

यदि स्थिति संतुष्ट है, हां-पैटर्न का उपयोग किया जाता है, अन्यथा नो-पैटर्न (यदि मौजूद है)। यदि दो से अधिक विकल्प उपपट्ट में मौजूद हैं, तो संकलन-समय त्रुटि उत्पन्न होती है। प्रत्येक दो विकल्पों में से प्रत्येक में किसी भी रूप के नेस्टेड सबपैटर्न शामिल हो सकते हैं, जिनमें सशर्त सबपैटर्न शामिल हैं; दो विकल्पों के लिए प्रतिबंध केवल शर्त के स्तर पर लागू होता है। निम्नलिखित पैटर्न टुकड़ा एक उदाहरण है जहां विकल्प जटिल हैं:

(?(1) (A|B|C) | (D | (?(2)E|F) | E) )

हालत चार प्रकार की होती है: उपपट्टों का संदर्भ, पुनरावृत्ति का संदर्भ, एक छद्म स्थिति जिसे DEFINE, और अभिकथन कहा जाता है।

नंबर के लिए एक प्रयुक्त Subpattern के लिए जाँच कर रहा है

यदि कोष्ठक के बीच के पाठ में अंकों का एक क्रम होता है, तो यह शर्त सही है यदि उस संख्या के एक उप-समूह को कैप्चर किया गया हो। यदि समान संख्या के साथ उप-कैप्चरिंग एक से अधिक मौजूद है ( Duplicate Subpattern Numbers पहले खंड देखें ), स्थिति सही है यदि उनमें से कोई भी मेल खाता है। एक वैकल्पिक संकेतन अंक को प्लस या माइनस साइन से पहले करना है। इस मामले में, उपपट्ट संख्या निरपेक्ष के बजाय सापेक्ष है। सबसे हाल ही में खोले गए कोष्ठकों को ((- 1) द्वारा संदर्भित किया जा सकता है, अगले सबसे हाल के ((- 2), और इसी तरह से। अंदर के छोरों, यह बाद के समूहों को संदर्भित करने के लिए भी समझ में आता है। खोला जा सकता है के रूप में संदर्भित किया जा सकता है (? (+ 1), और इतने पर। (इनमें से किसी भी रूप में मूल्य शून्य का उपयोग नहीं किया जाता है; यह एक संकलन-समय त्रुटि को भड़काता है।)

निम्नलिखित पैटर्न पर विचार करें, जिसमें इसे अधिक पठनीय बनाने के लिए गैर-महत्वपूर्ण व्हाट्सएप शामिल है ( extended चर्चा का विकल्प ) और चर्चा में आसानी के लिए इसे तीन भागों में विभाजित करें:

( \( )?    [^()]+    (?(1) \) )

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

यदि यह पैटर्न एक बड़े आकार में एम्बेडेड है, तो एक रिश्तेदार संदर्भ का उपयोग किया जा सकता है:

...other stuff... ( \( )?    [^()]+    (?(-1) \) ) ...

यह बड़े पैटर्न में कोष्ठकों के टुकड़े को स्वतंत्र बनाता है।

नाम से एक प्रयुक्त सबपैटर्न की जाँच करना

पर्ल उपयोग किए गए उप-समूह के लिए परीक्षण करने के लिए वाक्यविन्यास (? (<Name>) ...) या (? ('नाम') ...) का उपयोग करता है। पीसीआरई के पुराने संस्करणों के साथ संगतता के लिए, जिसमें पर्ल से पहले यह सुविधा थी, वाक्यविन्यास ((नाम) ...) भी मान्यता प्राप्त है।

एक नामित उपपट्ट का उपयोग करने के लिए पिछले उदाहरण को फिर से लिखना:

(?<OPEN> \( )?    [^()]+    (?(<OPEN>) \) )

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

पैटर्न पुनरावर्तन के लिए जाँच

यदि स्थिति स्ट्रिंग (R) है, और R नाम के साथ कोई सबपैटर्न नहीं है, तो यह शर्त सही है यदि पूरे पैटर्न या किसी भी सबपैटर्न के लिए पुनरावर्ती कॉल किया गया है। यदि अंक या नाम एम्परर्सैंड से पहले का है, तो उदाहरण के लिए R अक्षर का अनुसरण करें:

(?(R3)...) or (?(R&name)...)

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

"शीर्ष-स्तर" पर, ये सभी पुनरावर्तन परीक्षण की स्थिति झूठी हैं। पुनरावर्ती पैटर्न के लिए वाक्यविन्यास नीचे वर्णित है।

केवल संदर्भ के लिए उपयोग के लिए सबपैटर्न को परिभाषित करना

यदि स्थिति स्ट्रिंग (DEFINE) है, और DEFINE नाम के साथ कोई सबपैटर्न नहीं है, तो स्थिति हमेशा झूठी होती है। इस मामले में, सबपैटर्न में केवल एक ही विकल्प हो सकता है। यदि पैटर्न में इस बिंदु पर नियंत्रण पहुंच जाता है तो इसे हमेशा छोड़ दिया जाता है। DEFINE का विचार यह है कि इसका उपयोग "सबरूटीन्स" को परिभाषित करने के लिए किया जा सकता है जिसे अन्यत्र से संदर्भित किया जा सकता है। (सबरूटीन का उपयोग नीचे वर्णित है। उदाहरण के लिए, IPv4 पते से मिलान करने के लिए एक पैटर्न, जैसे कि "192.168.23.245", इस तरह लिखा जा सकता है (व्हाट्सएप और लाइन ब्रेक को अनदेखा करें):

(?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) ) \b (?&byte) (\.(?&byte)){3} \b

पैटर्न का पहला भाग एक DEFINE समूह है जिसके अंदर "बाइट" नाम का एक और समूह परिभाषित किया गया है। यह IPv4 पते के एक व्यक्तिगत घटक (एक संख्या <256) से मेल खाता है। जब मिलान होता है, तो पैटर्न का यह हिस्सा छोड़ दिया जाता है, क्योंकि DEFINE एक गलत स्थिति की तरह काम करता है। शेष पैटर्न IPv4 पते के चार डॉट-पृथक घटकों से मेल खाने के लिए नामित समूह के संदर्भ का उपयोग करता है, प्रत्येक छोर पर एक शब्द सीमा पर जोर देता है।

जोर देने की स्थिति

यदि हालत ऊपर के किसी भी प्रारूप में नहीं है, तो यह एक जोर होना चाहिए। यह एक सकारात्मक या नकारात्मक लुकहैड या जोर की खोज हो सकती है। निम्नलिखित पैटर्न पर विचार करें, जिसमें गैर-महत्वपूर्ण व्हाट्सएप शामिल है, और दूसरी पंक्ति में दो विकल्पों के साथ:

(?(?=[^a-z]*[a-z])
\d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )

हालत एक सकारात्मक रूपांतर परख है जो एक पत्र के बाद गैर-अक्षरों के वैकल्पिक अनुक्रम से मेल खाती है। यही है, यह विषय में कम से कम एक पत्र की उपस्थिति के लिए परीक्षण करता है। यदि कोई पत्र पाया जाता है, तो विषय को पहले विकल्प के खिलाफ मिलान किया जाता है, अन्यथा इसे दूसरे के खिलाफ मिलान किया जाता है। यह पैटर्न दो रूपों में से एक dd-aaa-dd या dd-dd-dd में मिलाता है, जहाँ aa अक्षर हैं और dd अंक हैं।

टिप्पणियाँ

पीसीआरई द्वारा संसाधित पैटर्न में टिप्पणियों को शामिल करने के दो तरीके हैं। दोनों ही मामलों में, टिप्पणी की शुरुआत किसी चरित्र वर्ग में, या किसी अन्य संबंधित अनुक्रम के बीच में नहीं होनी चाहिए जैसे कि? पैटर्न मिलान में।

अनुक्रम ((# एक टिप्पणी की शुरुआत को चिह्नित करता है जो अगले समापन कोष्ठक तक जारी रहता है। नेस्टेड कोष्ठक की अनुमति नहीं है। यदि विकल्प PCRE_EXTENDED सेट है, तो एक unescaped # वर्ण भी एक टिप्पणी प्रस्तुत करता है, जो इस मामले में तुरंत बाद जारी है। अगले न्यूलाइन वर्ण या पैटर्न में वर्ण अनुक्रम। किन वर्णों की व्याख्या की जाती है, क्योंकि नई रूपरेखाओं को संकलन समारोह में दिए गए विकल्पों या पैटर्न की शुरुआत में एक विशेष अनुक्रम द्वारा नियंत्रित किया जाता है, जैसा कि Newline Conventions पहले खंड में वर्णित है ।

ध्यान दें कि इस प्रकार की टिप्पणी का अंत पैटर्न में एक शाब्दिक न्यूलाइन अनुक्रम है; बचना क्रम है कि एक नई रेखा का प्रतिनिधित्व करने के लिए गिनती नहीं है। उदाहरण के लिए, extended सेट होने पर निम्न पैटर्न पर विचार करें , और डिफ़ॉल्ट न्यूलाइन कन्वेंशन लागू है:

abc #comment \n still comment

चरित्र # का सामना करने पर, pcre_compile() साथ में झांकता है, पैटर्न में एक नई रेखा की तलाश करता है। अनुक्रम \ n अभी भी इस स्तर पर शाब्दिक है, इसलिए यह टिप्पणी को समाप्त नहीं करता है। कोड मान 0x0a (डिफ़ॉल्ट न्यूलाइन) के साथ केवल एक चरित्र ऐसा करता है।

पुनरावर्ती पैटर्न

कोष्ठक में एक स्ट्रिंग मिलान की समस्या पर विचार करें, असीमित नेस्टेड कोष्ठक के लिए अनुमति देता है। पुनरावर्तन के उपयोग के बिना, सबसे अच्छा जो किया जा सकता है वह एक पैटर्न का उपयोग करना है जो घोंसले के शिकार की कुछ निश्चित गहराई तक मेल खाता है। मनमाने ढंग से घोंसले की गहराई को संभालना संभव नहीं है।

कुछ समय के लिए, पर्ल ने एक सुविधा प्रदान की है जो नियमित अभिव्यक्तियों को पुनरावृत्ति करने की अनुमति देती है (अन्य चीजों के बीच)। यह रनटाइम में अभिव्यक्ति में पर्ल कोड को इंटरपोल करके करता है, और कोड स्वयं अभिव्यक्ति को संदर्भित कर सकता है। कोष्ठक समस्या को हल करने के लिए कोड प्रक्षेप का उपयोग कर एक पर्ल पैटर्न इस तरह बनाया जा सकता है:

$re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;

आइटम (p {...}) क्रम में पर्ल कोड को प्रक्षेपित करता है, और इस मामले में पुनरावृत्ति को उस पैटर्न से संदर्भित करता है जिसमें वह दिखाई देता है।

जाहिर है, PCRE पर्ल कोड के प्रक्षेप का समर्थन नहीं कर सकता। इसके बजाय, यह पूरे पैटर्न की पुनर्संरचना के लिए, और अलग-अलग सबपैटर्न रिकर्सन के लिए विशेष सिंटैक्स का समर्थन करता है। पीसीआरई और पायथन में इसकी शुरूआत के बाद, इस तरह की पुनरावृत्ति को बाद में 5.10 में रिलीज में पर्ल में पेश किया गया था।

एक विशेष आइटम जिसमें एक नंबर> 0 होता है और एक बंद कोष्ठक किसी संख्या के उप-समूह का पुनरावर्ती उप-कॉल होता है, यदि यह उस उप-समूह के अंदर होता है। (यदि नहीं, तो यह एक गैर-पुनरावर्ती उप-कॉल है। , जो अगले भाग में वर्णित है।) विशेष आइटम (? आर) या (? 0) संपूर्ण नियमित अभिव्यक्ति का एक पुनरावर्ती कॉल है।

यह पीसीआरई पैटर्न नेस्टेड कोष्ठक समस्या को हल करता है (मान लें कि विकल्प extended सेट किया गया है ताकि व्हॉट्सएप को अनदेखा कर दिया जाए)

\( ( [^()]++ | (?R) )* \)

पहले यह एक प्रारंभिक कोष्ठक से मेल खाता है। फिर यह किसी भी संख्या में सबस्ट्रिंग से मेल खाता है, जो या तो गैर-कोष्ठक का एक अनुक्रम हो सकता है या पैटर्न के एक पुनरावर्ती मैच (जो कि सही ढंग से कोष्ठक प्रतिस्थापन है)। अंत में एक समापन कोष्ठक है। गैर-कोष्ठक के अनुक्रमों में पीछे हटने से बचने के लिए एक अधिकारपूर्ण मात्रा का उपयोग करने पर ध्यान दें।

यदि यह एक बड़े पैटर्न का हिस्सा था, तो आप पूरे पैटर्न को दोबारा प्राप्त नहीं करना चाहेंगे, इसलिए इसके बजाय आप इसका उपयोग कर सकते हैं:

( \( ( [^()]++ | (?1) )* \) )

पैटर्न यहां कोष्ठक के भीतर है ताकि पुनरावृत्ति पूरे पैटर्न के बजाय उन्हें संदर्भित करता है।

एक बड़े पैटर्न में, कोष्ठक संख्याओं पर नज़र रखना मुश्किल हो सकता है। यह सापेक्ष संदर्भों के उपयोग द्वारा आसान बनाया गया है। उपरोक्त पैटर्न में ((1) के बजाय, आप पुनरावृत्ति से पहले दूसरे सबसे हाल ही में खोले गए कोष्ठकों को संदर्भित करने के लिए (-2) लिख सकते हैं। यही है, एक नकारात्मक संख्या उस बिंदु से बाईं ओर कोष्ठक पर कब्जा करने की गणना करती है, जिस पर उसका सामना होता है।

बाद में खोले गए कोष्ठकों को संदर्भित करना भी संभव है, जैसे कि (? +2) संदर्भ लिखकर। हालाँकि, ये पुनरावर्ती नहीं हो सकते हैं, क्योंकि संदर्भ को संदर्भित किए गए कोष्ठक के अंदर नहीं है। वे हमेशा गैर-पुनरावर्ती उप-कॉल होते हैं, जैसा कि अगले भाग में बताया गया है।

इसके बजाय एक वैकल्पिक दृष्टिकोण नामांकित कोष्ठक का उपयोग करना है। इसके लिए पर्ल सिंटैक्स (? और नाम) है। पहले का PCRE सिंटैक्स (? P> नाम) भी समर्थित है। हम उपरोक्त उदाहरण को फिर से लिख सकते हैं:

(?<pn> \( ( [^()]++ | (?&pn) )* \) )

यदि एक ही नाम के साथ एक से अधिक सबपैटर्न हैं, तो सबसे पहले एक का उपयोग किया जाता है।

यह विशेष उदाहरण पैटर्न जो हमने अध्ययन किया है, इसमें नेस्टेड असीमित दोहराव शामिल हैं, और इसलिए गैर-कोष्ठक के तारों के मिलान के लिए एक अधिकारपूर्ण मात्रा का उपयोग महत्वपूर्ण है जब पैटर्न का मिलान नहीं करते हैं। उदाहरण के लिए, जब यह पैटर्न लागू होता है

(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()

यह जल्दी से "कोई मेल नहीं" देता है। हालाँकि, यदि एक मात्रात्मक परिमाणक का उपयोग नहीं किया जाता है, तो मैच लंबे समय तक चलता है, क्योंकि बहुत सारे अलग-अलग तरीके हैं + और * दोहराता है जो विषय को आगे बढ़ा सकता है, और विफलता की रिपोर्ट करने से पहले सभी का परीक्षण करना चाहिए।

एक मैच के अंत में, कोष्ठक पर कब्जा करने के मूल्य बाहरी स्तर से हैं। यदि ऊपर दिए गए पैटर्न का मिलान किया जाता है

(ab(cd)ef)

आंतरिक कैप्चरिंग कोष्ठकों (संख्या 2) के लिए मान "एफई" है, जो शीर्ष स्तर पर लिया गया अंतिम मूल्य है। यदि कैप्चरिंग सबपैटर्न को शीर्ष स्तर पर मिलान नहीं किया जाता है, तो इसका अंतिम कैप्चर किया गया मान परेशान होता है, भले ही यह मिलान प्रक्रिया के दौरान गहरे स्तर पर सेट (अस्थायी रूप से) था।

स्थिति (आर) के साथ मद (? आर) को भ्रमित न करें, जो पुनरावृत्ति के लिए परीक्षण करता है। निम्नलिखित पैटर्न पर विचार करें, जो कोण कोष्ठक में पाठ से मेल खाता है, मनमाने ढंग से घोंसले के शिकार के लिए अनुमति देता है। नेस्टेड कोष्ठक में केवल अंकों की अनुमति दी जाती है (जब कि पुनरावृत्ति होती है), जबकि किसी भी वर्ण को बाहरी स्तर पर अनुमति दी जाती है।

< (?: (?(R) \d++  | [^<>]*+) | (?R)) * >

यहां (? (R) एक सशर्त उप-समूह की शुरुआत है, जिसमें पुनरावर्ती और गैर-पुनरावर्ती मामलों के लिए दो अलग-अलग विकल्प हैं। आइटम (? R) वास्तविक पुनरावर्ती कॉल है।

पीसीआरई और पर्ल के बीच रिकर्सन प्रोसेसिंग में अंतर

पीसीआरई में रिकर्सन प्रोसेसिंग दो महत्वपूर्ण तरीकों से पर्ल से अलग है। पीसीआरई में (जैसे पायथन, लेकिन पर्ल के विपरीत), एक पुनरावर्ती उपपट्ट कॉल को हमेशा एक परमाणु समूह के रूप में माना जाता है। यही है, एक बार जब यह विषय स्ट्रिंग में से कुछ से मेल खाता है, तो इसे कभी भी दोबारा दर्ज नहीं किया जाता है, भले ही इसमें अनटाइटेड विकल्प हों और बाद में मिलान विफलता हो। यह निम्नलिखित पैटर्न द्वारा चित्रित किया जा सकता है, जिसका अर्थ है कि एक विषम संख्या में वर्णों का मिलान करना जिसमें विषम संख्या में वर्ण (उदाहरण के लिए, "a", "aba", "abcba", "abcdcba"):

^(.|(.)(?1)\2)$

विचार यह है कि यह या तो एक एकल चरित्र से मेल खाता है, या दो समान अक्षर जो एक सबप्लिंड्रोम के आसपास हैं। पर्ल में, यह पैटर्न काम करता है; पीसीआरई में यह काम नहीं करता है यदि पैटर्न तीन वर्णों से अधिक लंबा है। विषय स्ट्रिंग "अब्बा" पर विचार करें।

शीर्ष स्तर पर, पहले वर्ण का मिलान किया जाता है, लेकिन जैसा कि यह स्ट्रिंग के अंत में नहीं है, पहला विकल्प विफल हो जाता है, दूसरा विकल्प लिया जाता है, और पुनरावृत्ति अंदर आती है। पुनरावर्ती कॉल 1 को सबपैटर्न में सफलतापूर्वक मेल खाता है चरित्र ("बी")। (ध्यान दें कि लाइन परीक्षणों की शुरुआत और अंत पुनरावृत्ति का हिस्सा नहीं है।)

शीर्ष स्तर पर वापस, अगले चरित्र ("सी") की तुलना किस उपपट्ट 2 से हुई, जो "ए" था। यह विफल हो जाता है। जैसा कि पुनरावृत्ति को एक परमाणु समूह के रूप में माना जाता है, अब कोई पीछे हटने वाले बिंदु नहीं हैं, और इसलिए पूरा मैच विफल हो जाता है। (पर्ल अब पुनरावृत्ति में पुन: प्रवेश कर सकता है और दूसरा विकल्प आज़मा सकता है।) हालांकि, यदि पैटर्न दूसरे क्रम में विकल्पों के साथ लिखा गया है, तो चीजें अलग हैं:

^((.)(?1)\2|.)$

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

पैटर्न को बदलने के लिए ताकि यह सभी तालमेल से मेल खाता हो, न केवल एक विषम संख्या वाले वर्णों के साथ, यह इस पैटर्न को बदलने के लिए आकर्षक है:

^((.)(?1)\2|.?)$

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

^(?:((.)(?1)\2|)|((.)(?3)\4|.))

यदि आप विशिष्ट तालमेल वाक्यांशों से मेल खाना चाहते हैं, तो पैटर्न को सभी गैर-शब्द वर्णों को अनदेखा करना चाहिए, जो निम्नानुसार किया जा सकता है:

^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$

यदि विकल्प के साथ चलाया जाता है caseless , तो यह पैटर्न "एक आदमी, एक योजना, एक नहर: पनामा" जैसे वाक्यांशों से मेल खाता है! और यह PCRE और पर्ल दोनों में अच्छा काम करता है। गैर-शब्द वर्णों के अनुक्रम में पीछे हटने से बचने के लिए, अधिकारिक मात्रात्मक * + के उपयोग पर ध्यान दें। इसके बिना, PCRE ठेठ वाक्यांशों से मेल खाने में अधिक समय (10 गुना या अधिक) लेता है, और पर्ल को इतना लंबा समय लगता है कि आपको लगता है कि यह एक लूप में चला गया है।

ध्यान दें

पैलिंड्रोम-मैचिंग पैटर्न ऊपर काम करते हैं केवल अगर विषय स्ट्रिंग एक पैलिंड्रोम से शुरू नहीं होती है जो पूरे स्ट्रिंग से कम है। उदाहरण के लिए, हालांकि "अब्बा" का मिलान सही ढंग से किया जाता है, यदि विषय "अब्बा" है, तो पीसीआरई को शुरुआत में पैलिंड्रोम "अबा" मिलता है, और फिर शीर्ष स्तर पर विफल रहता है, क्योंकि स्ट्रिंग का अंत अनुसरण नहीं करता है। एक बार फिर, यह अन्य विकल्पों की कोशिश करने के लिए पुनरावृत्ति में नहीं कूद सकता है, इसलिए पूरा मैच विफल हो जाता है।

दूसरा तरीका जिसमें पीसीआरई और पर्ल अपने रिकर्सन प्रोसेसिंग में भिन्न हैं, कैप्चर किए गए मानों की हैंडलिंग में है। पर्ल में, जब एक सबपैटर्न को पुनरावर्ती कहा जाता है या एक सबपैटर्न के रूप में (अगले भाग को देखें), इसकी किसी भी मूल्य तक पहुंच नहीं है जो पुनरावृत्ति के बाहर कब्जा कर लिया गया था। पीसीआरई में इन मूल्यों को संदर्भित किया जा सकता है। निम्नलिखित पैटर्न पर विचार करें:

^(.)(\1|a(?2))

पीसीआरई में, यह "बाबा" से मेल खाता है। पहले कैप्चरिंग कोष्ठक "बी" से मेल खाते हैं, फिर दूसरे समूह में, जब बैक रेफरेंस \ 1 "बी" से मेल नहीं खाता है, तो दूसरा वैकल्पिक "ए" से मेल खाता है, और फिर रिकर्स करता है। पुनरावृत्ति में, \ "अब" बी "से मेल खाता है और इसलिए पूरा मैच सफल होता है। पर्ल में, पैटर्न मिलान करने में विफल रहता है क्योंकि पुनरावर्ती कॉल के अंदर बाह्य रूप से सेट किए गए मान तक नहीं पहुंच सकता।

उपप्रांतों को सबरूटीन्स के रूप में

यदि एक पुनरावर्ती सबपैटर्न कॉल (या तो संख्या या नाम से) के लिए वाक्यविन्यास का उपयोग कोष्ठक के बाहर किया जाता है, जिसे वह संदर्भित करता है, यह एक प्रोग्रामिंग भाषा में उप-भाषा की तरह काम करता है। संदर्भ के पहले या बाद में बुलाया उपपट्ट को परिभाषित किया जा सकता है। निम्नलिखित उदाहरणों के अनुसार एक संख्या संदर्भ निरपेक्ष या सापेक्ष हो सकता है:

(...(absolute)...)...(?2)...
(...(relative)...)...(?-1)...
(...(?+1)...(relative)...

एक पूर्व उदाहरण ने बताया कि निम्नलिखित पैटर्न "समझदारी और संवेदनशीलता" और "प्रतिक्रिया और जिम्मेदारी" से मेल खाता है, लेकिन "समझदारी और जिम्मेदारी" नहीं:

(sens|respons)e and \1ibility

यदि इसके बजाय निम्नलिखित पैटर्न का उपयोग किया जाता है, तो यह "समझदारी और जिम्मेदारी" और अन्य दो तारों से मेल खाता है:

(sens|respons)e and (?1)ibility

इससे पहले DEFINE की चर्चा में एक और उदाहरण दिया गया है।

सभी सबरूटीन कॉल, पुनरावर्ती या नहीं, हमेशा परमाणु समूहों के रूप में माना जाता है। यही है, एक बार जब एक सबरूटीन ने विषय स्ट्रिंग में से कुछ का मिलान कर लिया है, तो इसे कभी भी पुनः दर्ज नहीं किया जाता है, भले ही इसमें अनटाइटेड विकल्प शामिल हों और बाद में मिलान विफलता हो। सबरूटीन कॉल के दौरान सेट किए गए किसी भी कैप्चरिंग कोष्ठक बाद में अपने पिछले मूल्यों पर वापस लौटते हैं।

केस-आज़ादी जैसे प्रसंस्करण विकल्प तय किए जाते हैं जब एक सबपैटर्न को परिभाषित किया जाता है, इसलिए यदि इसे सबरूटीन के रूप में उपयोग किया जाता है, तो ऐसे विकल्पों को अलग-अलग कॉल के लिए नहीं बदला जा सकता है। उदाहरण के लिए, निम्नलिखित पैटर्न "abcabc" से मेल खाता है, लेकिन "abcABC" से नहीं, क्योंकि प्रसंस्करण विकल्प का परिवर्तन तथाकथित उप-प्रपात को प्रभावित नहीं करता है:

(abc)(?i:(?-1))

ओनिगुरुमा सबरूटीन सिंटेक्स

Oniguruma के साथ संगतता के लिए, गैर-पर्ल सिंटैक्स \ g जिसके नाम या संख्या को कोष्ठक या एकल कोट्स में संलग्न किया गया है, एक उप-अंक के रूप में उप-रूप में संदर्भित करने के लिए वैकल्पिक सिंटैक्स है, संभवतः पुनरावर्ती। ऊपर दिए गए उदाहरणों में से दो इस प्रकार हैं, इस सिंटैक्स का उपयोग करके फिर से लिखा गया है:

(?<pn> \( ( (?>[^()]+) | \g<pn> )* \) )
(sens|respons)e and \g'1'ibility

PCRE Oniguruma के लिए एक एक्सटेंशन का समर्थन करता है: यदि कोई संख्या प्लस या माइनस साइन से पहले होती है, तो इसे एक रिश्तेदार संदर्भ के रूप में लिया जाता है, उदाहरण के लिए:

(abc)(?i:\g<-1>)

ध्यान दें कि \ g {...} (Perl syntax) और \ g <...> (Oniguruma syntax) पर्यायवाची नहीं हैं । पूर्व एक पिछला संदर्भ है; उत्तरार्द्ध एक सबरूटीन कॉल है।

नियंत्रण वापस

पर्ल 5.10 ने कुछ "स्पेशल बैकट्रैकिंग कंट्रोल वर्ब्स" की शुरुआत की, जो अभी भी पर्ल दस्तावेज में "पर्ल के भविष्य के संस्करण में परिवर्तन या हटाने के लिए प्रयोगात्मक और विषय के रूप में" वर्णित हैं। यह कहा जाता है: "उत्पादन कोड में उनका उपयोग उन्नयन के दौरान समस्याओं से बचने के लिए ध्यान दिया जाना चाहिए।" इस खंड में वर्णित पीसीआरई सुविधाओं पर भी यही टिप्पणी लागू होती है।

नई क्रिया पहले अमान्य सिंटैक्स का उपयोग करती है: एक प्रारंभिक कोष्ठक जिसके बाद तारांकन चिह्न होता है। वे आम तौर पर फॉर्म (* VERB) या (* VERB: NAME) के होते हैं। कुछ या तो रूप ले सकते हैं, संभवतः एक नाम मौजूद होने के आधार पर अलग-अलग व्यवहार कर रहे हैं। एक नाम वर्णों का कोई अनुक्रम है जिसमें एक समापन कोष्ठक शामिल नहीं है। 8-बिट लाइब्रेरी में अधिकतम नाम की लंबाई 255 और 16-बिट और 32-बिट लाइब्रेरी में 65535 है। यदि नाम रिक्त है, अर्थात, यदि बंद कोष्ठक तुरंत बृहदान्त्र का अनुसरण करता है, तो प्रभाव ऐसा है जैसे बृहदान्त्र नहीं था। इन क्रियाओं की कोई भी संख्या एक पैटर्न में हो सकती है।

इन क्रियाओं को दोहराए गए समूहों, कथनों, और उपपरिणामों में उप-वृत्तियों के रूप में कहा जाता है (चाहे पुनरावर्ती हो या नहीं)।

अनुकूलन जो क्रियाओं को पीछे ले जाते हैं

पीसीआरई में कुछ अनुकूलन शामिल हैं जिनका उपयोग प्रत्येक मैच के प्रयास की शुरुआत में कुछ चेक चलाकर मिलान को तेज करने के लिए किया जाता है। उदाहरण के लिए, यह मिलान विषय की न्यूनतम लंबाई को जान सकता है, या कि किसी विशेष चरित्र को उपस्थित होना चाहिए। जब इनमें से एक अनुकूलन किसी मैच के चलने को दरकिनार कर देता है, तो इसमें शामिल कोई भी बैकग्राउंडिंग क्रिया संसाधित नहीं होती है। संसाधित। आप विकल्प की स्थापना द्वारा शुरू की मैचों की अनुकूलन को दबाने कर सकते हैं no_start_optimize जब बुला compile/2 या run/3 , या के साथ (* NO_START_OPT) पैटर्न शुरू करने से।

पर्ल के साथ प्रयोग बताते हैं कि इसमें भी इसी तरह के अनुकूलन होते हैं, जो कभी-कभी असामयिक परिणामों की ओर ले जाते हैं।

क्रिया है कि अधिनियम तुरंत

निम्नलिखित क्रियाएं सामने आते ही कार्य करती हैं। उन्हें किसी नाम का अनुसरण नहीं करना चाहिए।

(*ACCEPT)

इस क्रिया के कारण मैच का अंत सफलतापूर्वक हो जाता है, शेष पैटर्न को छोड़ देता है। हालाँकि, जब यह एक सबपैटर्न के अंदर होता है जिसे सबरूटीन कहा जाता है, केवल वह सबपैटर्न सफलतापूर्वक समाप्त हो जाता है। मिलान तब बाहरी स्तर पर जारी रहता है। यदि (* ACCEPT) एक सकारात्मक अभिक्रिया में ट्रिगर होता है, तो अभिकथन सफल होता है; एक नकारात्मक दावे में, अभिकथन विफल हो जाता है।

यदि (* ACCEPT) कोष्ठकों को कैप्चर करने के अंदर है, तो अब तक का डेटा कैप्चर किया गया है। उदाहरण के लिए, निम्नलिखित मैच "एबी", "एएडी", या "एसीडी" हैं। जब यह "एबी" से मेल खाता है, तो "बी" बाहरी कोष्ठक द्वारा कब्जा कर लिया जाता है।

A((?:A|B(*ACCEPT)|C)D)

निम्नलिखित क्रिया एक मेल विफलता का कारण बनती है, जिससे बैकट्रैकिंग उत्पन्न होती है। यह (!) के बराबर है लेकिन पढ़ने में आसान है।

(*FAIL) or (*F)

पर्ल दस्तावेज़ में कहा गया है कि यह केवल तभी उपयोगी है जब ({}) या (?? {}) के साथ संयुक्त हो। वे Perl विशेषताएँ हैं जो PCRE में मौजूद नहीं हैं।

स्ट्रिंग "आआआ" के साथ एक मैच हमेशा विफल रहता है, लेकिन प्रत्येक बैकट्रैक के होने से पहले कॉलआउट लिया जाता है (इस उदाहरण में, 10 बार)।

रिकॉर्डिंग कौन सा रास्ता लिया गया था

इस क्रिया का मुख्य उद्देश्य यह पता लगाना है कि एक मैच कैसे आया था, हालांकि इसका एक प्रारंभिक उपयोग मैच के शुरुआती बिंदु (आगे (* SKIP) नीचे देखें) को आगे बढ़ाने में भी है।

ध्यान दें

एर्लैंग में, के साथ एक निशान को पुनः प्राप्त करने के लिए कोई इंटरफ़ेस नहीं है run/2 , इसलिए केवल माध्यमिक उद्देश्य एरलैंग प्रोग्रामर के लिए प्रासंगिक है।

इस खंड के बाकी हिस्से को जानबूझकर एर्लांग प्रोग्रामर द्वारा पढ़ने के लिए अनुकूलित नहीं किया गया है, लेकिन उदाहरण NAMES को समझने में मदद कर सकते हैं क्योंकि वे (* SKIP) द्वारा उपयोग किए जा सकते हैं।

(*MARK:NAME) or (*:NAME)

इस क्रिया के साथ एक नाम की आवश्यकता होती है। एक पैटर्न में आप जितने चाहें उतने (* MARK) हो सकते हैं, और उनके नाम अद्वितीय नहीं होने चाहिए।

जब कोई मैच सफल होता है, तो मिलान पथ पर अंतिम सामना किया गया नाम (* MARK: NAME), (* PRUNE: NAME), या (* THEN: NAME) कॉल करने वाले को वापस भेज दिया जाता है, जैसा कि अनुभाग में वर्णित अतिरिक्त डेटा के लिए है। pcre_exec() " pcreapi प्रलेखन में। pcretest आउटपुट के निम्नलिखित उदाहरण में , / K संशोधक डेटा (* MARK) के पुनर्प्राप्ति और आउटपुट के लिए अनुरोध करता है:

  re> /X(*MARK:A)Y|X(*MARK:B)Z/K
data> XY
 0: XY
MK: A
XZ
 0: XZ
MK: B

इस आउटपुट में (* MARK) नाम "MK:" के साथ टैग किया गया है और इस उदाहरण में यह इंगित करता है कि दोनों विकल्पों में से कौन सा विकल्प है। यह प्रत्येक जानकारी को अपने स्वयं के कैप्चरिंग कोष्ठकों में रखने की तुलना में इस जानकारी को प्राप्त करने का एक अधिक कुशल तरीका है।

यदि एक नाम के साथ एक क्रिया का सामना एक सकारात्मक दावे में किया जाता है जो कि सच है, तो नाम दर्ज किया जाता है और यदि यह अंतिम सामना किया गया है तो वापस पारित किया जाता है। यह नकारात्मक अभिकथन या सकारात्मक अभिक्रियाओं को विफल करने के लिए नहीं होता है।

एक आंशिक मैच या एक असफल मैच के बाद, पूरी मैच प्रक्रिया में अंतिम रूप दिया गया नाम वापस आ जाता है, उदाहरण के लिए:

  re> /X(*MARK:A)Y|X(*MARK:B)Z/K
data> XP
No match, mark = B

ध्यान दें कि इस अप्रकाशित उदाहरण में, निशान को मैच के प्रयास से बरकरार रखा गया है जो विषय में पत्र "एक्स" पर शुरू हुआ था। बाद के मैच के प्रयास "P" से शुरू होते हैं और फिर एक खाली स्ट्रिंग के साथ जहां तक ​​(* MARK) आइटम नहीं मिलता है, फिर भी इसे रीसेट नहीं करते हैं।

क्रिया है कि एक्ट बैकट्रैकिंग के बाद

जब वे सामने आते हैं तो निम्नलिखित क्रियाएं कुछ नहीं करती हैं। मिलान इस प्रकार होता है, लेकिन यदि बाद में कोई मैच नहीं होता है, तो क्रिया के पीछे जाने के कारण विफलता का सामना करना पड़ता है। यही है, बैकट्रैकिंग क्रिया के बाईं ओर नहीं जा सकता है। हालाँकि, जब इन क्रियाओं में से कोई एक परमाणु समूह के अंदर दिखाई देता है या एक ऐसा दावा जो सच है, तो इसका प्रभाव उस समूह तक ही सीमित रहता है, क्योंकि एक बार समूह का मिलान हो जाने के बाद, इसमें कभी कोई बैकट्रैक नहीं होता है। इस स्थिति में, बैकट्रैकिंग पूरे परमाणु समूह या जोर के बाईं ओर "कूद वापस" कर सकती है। (यह भी याद रखें, जैसा कि ऊपर कहा गया है, कि यह स्थानीयकरण सबरूटीन कॉल में भी लागू होता है।)

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

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

(*COMMIT)

यदि (* COMMIT) एकमात्र बैकट्रैकिंग क्रिया है जिसका सामना किया गया है, एक बार जब यह पारित run/2 हो जाता है, तो वर्तमान शुरुआती बिंदु पर एक मैच खोजने के लिए प्रतिबद्ध है, या नहीं, उदाहरण के लिए:

a+(*COMMIT)b

यह "xxaab" से मेल खाता है, लेकिन "एकाब" से नहीं। इसे एक प्रकार के गतिशील एंकर के रूप में माना जा सकता है, या "मैंने शुरू किया है, इसलिए मुझे समाप्त करना होगा"। पथ में सबसे हाल ही में पारित (* MARK) का नाम वापस पारित किया जाता है जब (* COMMIT) एक मैच की विफलता को मजबूर करता है।

यदि एक से अधिक बैकट्रैकिंग क्रिया एक पैटर्न में मौजूद है, तो एक अलग (निम्न) का पहला ट्रिगर किया जा सकता है, इसलिए एक मैच के दौरान केवल पास होना (* COMMIT) हमेशा गारंटी नहीं देता है कि मैच इस शुरुआती बिंदु पर होना चाहिए।

ध्यान दें कि (* COMMIT) एक पैटर्न की शुरुआत में एक एंकर के समान नहीं है, जब तक कि पीसीआरई स्टार्ट-ऑफ-मैच मिलान बंद नहीं किए जाते हैं, जैसा कि निम्नलिखित उदाहरण में दिखाया गया है:

1> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list}]).
{match,["abc"]}
2> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list},no_start_optimize]).
nomatch

इस पैटर्न के लिए, PCRE जानता है कि किसी भी मैच की शुरुआत "a" से होनी चाहिए, इसलिए डेटा के पहले सेट में पैटर्न लागू करने से पहले ऑप्टिमाइज़ेशन "a" के साथ होता है। मैच का प्रयास तब सफल होता है। दूसरे कॉल में no_start_optimize ऑप्टिमाइज़ेशन को अक्षम करता है जो पहले वर्ण के साथ स्कीप करता है। पैटर्न अब "x" पर शुरू किया गया है, और इसलिए (* COMMIT) मैच को किसी अन्य आरंभिक अंक की कोशिश किए बिना विफल हो जाता है।

निम्न क्रिया के कारण मैच में विषय की वर्तमान स्थिति में असफल होने का कारण बनता है यदि बाद में मेल करने वाली विफलता होती है जो पीछे पहुँचने का कारण बनती है:

(*PRUNE) or (*PRUNE:NAME)

यदि पैटर्न असमान है, तो सामान्य "बम्पालॉन्ग" अगले शुरुआती चरित्र के लिए अग्रिम होता है। बैकट्रैकिंग सामान्य रूप से (* PRUNE) के बाईं ओर हो सकती है, पहुंचने से पहले, या (* PRUNE) के दाईं ओर मिलान करते समय, लेकिन यदि दाईं ओर कोई मेल नहीं है, तो backtracking पार नहीं कर सकता (* PRUNE) साधारण मामलों में, (* PRUNE) का उपयोग केवल एक परमाणु समूह या अधिकारपूर्ण मात्रा का विकल्प है, लेकिन (* PRUNE) के कुछ उपयोग हैं जिन्हें किसी अन्य तरीके से व्यक्त नहीं किया जा सकता है। एंकर पैटर्न में, (* PRUNE) का प्रभाव (* COMMIT) के समान होता है।

(* PRUNE: NAME) का व्यवहार समान नहीं है (* MARK: NAME) (* PRUNE)। यह इस तरह है (* MARK: NAME) कि नाम को वापस कॉल करने वाले के लिए याद किया जाता है। हालाँकि, (* SKIP: NAME) केवल (* MARK) के साथ निर्धारित नामों की खोज करता है।

ध्यान दें

यह तथ्य कि (* PRUNE: NAME) नाम याद है, नाम एर्लांग प्रोग्रामर के लिए बेकार है, क्योंकि नाम पुनः प्राप्त नहीं किए जा सकते हैं।

निम्न क्रिया, जब बिना नाम के निर्दिष्ट की जाती है, (* PRUNE) की तरह, सिवाय इसके कि यदि पैटर्न असमान है, तो "बम्पालॉन्ग" अग्रिम अगले वर्ण के लिए नहीं है, लेकिन विषय में उस स्थिति में है जहां (* SKIP) था का सामना करना पड़ा।

(*SKIP)

(* SKIP) यह दर्शाता है कि जो भी पाठ से मेल खाता था वह एक सफल मैच का हिस्सा नहीं हो सकता। विचार करें:

a+(*SKIP)b

यदि विषय "आआआक ..." है, तो पहले मैच के प्रयास विफल होने के बाद (स्ट्रिंग में पहले चरित्र पर शुरू), शुरुआती बिंदु "सी" पर अगला प्रयास शुरू करने के लिए रुक जाता है। ध्यान दें कि एक मात्रात्मक परिमाणक का इस उदाहरण के समान प्रभाव नहीं है; हालांकि यह पहले मैच के प्रयास के दौरान बैकट्रैकिंग को दबा देगा, दूसरा प्रयास "सी" पर लंघन के बजाय दूसरे चरित्र पर शुरू होगा।

जब (* SKIP) का एक संबद्ध नाम होता है, तो इसका व्यवहार संशोधित होता है:

(*SKIP:NAME)

जब इसे ट्रिगर किया जाता है, तो पैटर्न के माध्यम से पिछले पथ को सबसे हाल के लिए खोजा जाता है (* MARK) जिसका समान नाम है। यदि कोई पाया जाता है, तो "बम्पालॉन्ग" अग्रिम उस विषय स्थिति में है जो उस स्थान (* MARK) से मेल खाती है जहां (* SKIP) का सामना किया गया था। यदि मिलान नाम के साथ कोई (* MARK) नहीं पाया जाता है, (* SKIP) को अनदेखा कर दिया जाता है।

ध्यान दें कि (* SKIP: NAME) केवल (* MARK: NAME) द्वारा निर्धारित नामों की खोज करता है। यह उन नामों की उपेक्षा करता है जो (* PRUNE: NAME) या (* THEN: NAME) द्वारा निर्धारित किए जाते हैं।

जब बैकग्राउंड उस तक पहुँचता है तो निम्नलिखित क्रिया अगले अंतरतम विकल्प को छोड़ देती है। यही है, यह वर्तमान विकल्प के भीतर किसी भी आगे पीछे रद्द कर देता है।

(*THEN) or (*THEN:NAME)

क्रिया नाम अवलोकन से आता है कि इसका उपयोग पैटर्न-आधारित if-then-अन्यथा ब्लॉक के लिए किया जा सकता है:

( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...

यदि COND1 पैटर्न मैच करता है, तो FOO की कोशिश की जाती है (और संभवतः समूह के अंत के बाद आगे के आइटम यदि FOO सफल होता है)। असफल होने पर, मिलानकर्ता दूसरे विकल्प के लिए रुक जाता है और COND2 की कोशिश करता है, COND1 में पीछे हटे बिना। यदि वह सफल होता है और BAR विफल हो जाता है, तो COND3 की कोशिश की जाती है। यदि BAZ तब विफल हो जाता है, तो अधिक विकल्प नहीं होते हैं, इसलिए पूरे समूह से पहले जो भी आया है, उसका एक बैकट्रैक है। यदि (* THEN) एक विकल्प के अंदर नहीं है, तो यह (* PRUNE) की तरह कार्य करता है।

(* THEN: NAME) का व्यवहार समान नहीं है (* MARK: NAME) (* THEN)। यह इस तरह है (* MARK: NAME) कि नाम को वापस कॉल करने वाले के लिए याद किया जाता है। हालाँकि, (* SKIP: NAME) केवल (* MARK) के साथ निर्धारित नामों की खोज करता है।

ध्यान दें

यह तथ्य कि (* THEN: NAME) नाम याद है कि नाम Erlang प्रोग्रामर के लिए बेकार है, क्योंकि नाम पुनर्प्राप्त नहीं किए जा सकते हैं।

एक उपपट्ट जिसमें कोई नहीं होता है | चरित्र केवल संलग्न विकल्प का एक हिस्सा है; यह केवल एक विकल्प के साथ एक नेस्टेड विकल्प नहीं है। (* THEN) का प्रभाव इस तरह के एक उपप्रकार से आगे के संलग्नक विकल्प तक फैला हुआ है। निम्नलिखित पैटर्न पर विचार करें, जहां ए, बी, और इतने पर, जटिल पैटर्न टुकड़े हैं जिनमें कोई भी शामिल नहीं है | इस स्तर पर पात्र:

A (B(*THEN)C) | D

यदि A और B मेल खाते हैं, लेकिन C में विफलता है, तो मिलान A में पीछे नहीं जाता है; इसके बजाय यह अगले विकल्प की ओर जाता है, जो कि डी। है, हालांकि, यदि उपपट्ट वाले (* THEN) को एक विकल्प दिया जाता है, तो यह अलग तरह से व्यवहार करता है:

A (B(*THEN)C | (*FAIL)) | D

(* THEN) का प्रभाव अब आंतरिक उपपट्ट तक ही सीमित है। C में एक विफलता के बाद, मिलान (* FAIL) में चला जाता है, जो पूरे उप-पथ को विफल करने का कारण बनता है, क्योंकि कोशिश करने के लिए अधिक विकल्प नहीं हैं। इस मामले में, मिलान अब A में पीछे हो जाता है।

ध्यान दें कि एक सशर्त उप-समूह को दो विकल्पों के रूप में नहीं माना जाता है, क्योंकि केवल एक का कभी उपयोग किया जाता है। वह है, | सशर्त उपपट्ट में चरित्र का एक अलग अर्थ है। व्हाट्सएप को नजरअंदाज करना, विचार करें:

^.*? (?(?=a) a | b(*THEN)c )

यदि विषय "बा" है, तो यह पैटर्न मेल नहीं खाता है। जैसा ।*? अस्वाभाविक है, यह शुरू में शून्य वर्णों से मेल खाता है। स्थिति (! = A) तब विफल रहती है, वर्ण "b" का मिलान किया जाता है, लेकिन "c" नहीं है। इस बिंदु पर, मिलान पीछे नहीं जाता है। * जैसा कि शायद उपस्थिति से उम्मीद की जा सकती है | चरित्र। सशर्त उपपट्ट एकल विकल्प का हिस्सा है जिसमें संपूर्ण पैटर्न शामिल होता है, और इसलिए मैच विफल हो जाता है। (अगर वहाँ एक backtrack में था। *? यह "बी" मैच के लिए अनुमति देता है, मैच सफल होगा।)

ऊपर वर्णित क्रियाएँ बाद की मिलान विफल होने पर नियंत्रण की चार अलग-अलग "ताकत" प्रदान करती हैं:

  • (* THEN) सबसे कमजोर है, अगले विकल्प पर मैच को लेकर।

  • (* PRUNE) अगला आता है, मौजूदा शुरुआती स्थिति में मैच को विफल करता है, लेकिन अगले चरित्र (एक अनछुए पैटर्न के लिए) के लिए अग्रिम की अनुमति देता है।

  • (* SKIP) समान है, सिवाय इसके कि अग्रिम एक से अधिक वर्ण हो सकता है।

  • (* COMMIT) सबसे मजबूत है, जिससे पूरा मैच विफल हो जाता है।

वन बैकट्रैकिंग वर्ब से अधिक

यदि एक से अधिक बैकट्रैकिंग क्रिया एक पैटर्न में मौजूद है, तो वह जो पहले कृत्यों में बैकट्रैक है। उदाहरण के लिए, निम्नलिखित पैटर्न पर विचार करें, जहां ए, बी और इसी तरह के जटिल पैटर्न टुकड़े हैं:

(A(*COMMIT)B(*THEN)C|ABD)

यदि A मैच करता है, लेकिन B विफल रहता है, तो (* COMMIT) बैकट्रैक पूरे मैच को विफल कर देता है। हालाँकि, यदि A और B मैच करते हैं, लेकिन C विफल रहता है, तो (* THEN) बैकट्रैक अगले वैकल्पिक (ABD) का कारण बनता है। यह व्यवहार सुसंगत है, लेकिन हमेशा पर्ल के समान नहीं है। इसका अर्थ है कि यदि उत्तराधिकार में दो या अधिक बैकट्रिंग क्रियाएं दिखाई देती हैं, तो उनमें से अंतिम का कोई प्रभाव नहीं पड़ता है। निम्नलिखित उदाहरण पर विचार करें:

...(*COMMIT)(*PRUNE)...

यदि दाईं ओर एक मेल विफलता है, तो बैकग्राउंडिंग ऑन (* PRUNE) इसका कारण बनता है, और इसकी कार्रवाई की जाती है। वहाँ (* COMMIT) पर कभी भी कोई बैकट्रैक नहीं हो सकता है।

बार-बार समूह में क्रियाओं को पीछे करना

PCRE पर्ल से दोहराए गए समूहों में पीछे की क्रियाओं से निपटने में भिन्न होता है। उदाहरण के लिए, विचार करें:

/(a(*COMMIT)b)+ac/

यदि विषय "अबैक" है, तो पर्ल मेल खाता है, लेकिन पीसीआरई विफल रहता है क्योंकि (* COMMIT) समूह कृत्यों के दूसरे दोहराने में।

क्रियाओं में क्रियाओं को पीछे करना

(* असफल) एक दावे में इसका सामान्य प्रभाव होता है: यह एक तत्काल बैकट्रैक को मजबूर करता है।

(* ACCEPT) एक सकारात्मक अभिक्रिया में अभिक्रिया बिना किसी और प्रक्रिया के सफल होने का कारण बनती है। एक नकारात्मक दावे में, (* ACCEPT) बिना किसी और प्रक्रिया के असफलता का कारण बनता है।

यदि वे एक सकारात्मक अभिक्रिया में दिखाई देते हैं, तो अन्य पीछे आने वाली क्रियाओं का विशेष उपचार नहीं किया जाता है। विशेष रूप से, (* THEN) अगले वैकल्पिक समूह में अगले विकल्प को छोड़ देता है, जिसमें विकल्प होते हैं, भले ही यह जोर के भीतर हो।

नकारात्मक दावे, हालांकि, अलग-अलग हैं, यह सुनिश्चित करने के लिए कि सकारात्मक अभिक्रिया को एक नकारात्मक अभिक्रिया में बदलने से इसका परिणाम बदल जाता है। बैकग्राउंडिंग (* COMMIT), (* SKIP), या (* PRUNE) में किसी भी आगे की वैकल्पिक शाखाओं पर विचार किए बिना, एक नकारात्मक दावे को सत्य बनाता है। बैकग्राउंडिंग (* THEN) के कारण यह मुखर (सामान्य व्यवहार) के भीतर अगले घेरने वाले विकल्प को छोड़ देता है, लेकिन यदि अभिकथन में ऐसा कोई विकल्प नहीं है, (* THEN) ऐसा व्यवहार करता है (* PRUNE)

सबरूटीन्स में क्रियाओं को पीछे ले जाना

इन व्यवहारों की परवाह किए बिना होता है यदि उपपट्ट को पुनरावर्ती कहा जाता है। पर्ल में सबरूटीन का उपचार कुछ मामलों में अलग है।

  • (* विफल) एक सबपैटर्न में जिसे सबरूटीन कहा जाता है, इसका सामान्य प्रभाव होता है: यह एक तत्काल बैकट्रैक को बाध्य करता है।

  • (* ACCEPT) सबरटीन में एक सबरूटीन के रूप में कहा जाता है कि सबरूटीन मैच के बिना किसी और प्रसंस्करण के सफल होने का कारण बनता है। मैचिंग तब सबरूटीन कॉल के बाद भी जारी रहती है।

  • (* COMMIT), (* SKIP), और (* PRUNE) एक उपपट्ट में जिसे सबरूटीन कहा जाता है, सबरूटीन मैच के विफल होने का कारण बनता है।

  • (* THEN) विकल्प के पास उप-समूह के भीतर अंतर-समूह में अगले विकल्प पर पहुंच जाता है जिसमें विकल्प होते हैं। यदि सबपैटर्न के भीतर ऐसा कोई समूह नहीं है, तो (* THEN) सबरूटीन मैच के विफल होने का कारण बनता है।

Original text