2010-10-08 17 views
5

मेरे पास एक पर्ल रेगेक्स है। लेकिन मुझे यकीन नहीं है कि "?" इस संदर्भ में मतलब है।इस पर्ल रेगेक्स में `?` का क्या अर्थ है?

m#(?:\w+)#

? का अर्थ क्या है?

+5

सबसे स्पष्ट के साथ शुरुआत: perlre (http://perldoc.perl.org/perlre.html)। – musiKk

+0

@msw और उनमें से एक [यह पृष्ठ यहां है] (http://stackoverflow.com/questions/3890739/what-does-mean-in-this-perl-regex?rq=1)। – rightfold

उत्तर

25

इस मामले में, ? वास्तव में : के संबंध में उपयोग किया जा रहा है। समूहबद्ध होने की शुरुआत में ?: समूह को समूहित करने के लिए समूह/समूह को कैप्चर नहीं करना है (जैसा कि, यह \1 या $1 जैसे किसी भी बैकरेरेंस में संग्रहीत नहीं किया जाएगा, इसलिए आप समूह तक पहुंच नहीं पाएंगे सीधे पाठ)।

  1. ? परिमाणक का प्रतीक है एक अभिव्यक्ति की "शून्य या एक पुनरावृत्ति":

    अधिक विशेष रूप से, एक ? regex में तीन अलग-अलग अर्थ हैं। विहित उदाहरण मैंने देखा है में से एक s?he है जो की पूर्ति करेंगे, दोनों she और he? के बाद से s "वैकल्पिक"

  2. एक परिमाणक (+, *, ?, या सामान्य {n,m}) द्वारा पीछा किया जाता है बनाता है एक ? तो मैच गैर लालची है

  3. एक parenthesized समूह की शुरुआत में एक ? का प्रतीक है कि आप एक विशेष प्रदर्शन करने के लिए चाहते हैं (यानी यह कि स्थिति यह है कि मैच आगे बढ़ने के लिए अनुमति देता है से शुरू कम से कम स्ट्रिंग से मेल खाएगी) कार्रवाई। इस मामले में, : समूह का मतलब है लेकिन कब्जा नहीं है। उपलब्ध कार्यों का सही सूची एक से दूसरे regex इंजन से कुछ हद तक अलग अलग होंगे, लेकिन यहां उनमें से कुछ की एक सूची (जरूरी नहीं सब समावेशी) है: एक के लिए (?=a):

    Non-capturing group: (?:text)
    बी Lookaround लुकहेड, ?! नकारात्मक लुकहेड के लिए, या ?<= और ?<! लुकबेइंड्स (क्रमशः सकारात्मक और नकारात्मक) के लिए।
    सी Conditional Matches: (?(condition)then|else)
    डी Atomic Grouping: a(?>bc|b)c (मेल खाता है abcc लेकिन नहींabc; लिंक देखें)
    Inline enabling/disabling of regex matching modifiers: ?i निष्क्रिय करने के लिए एक विधा, ?-i सक्षम करने के लिए। आप उन्हें एक साथ एक से अधिक संशोधक को सक्षम/अक्षम भी कर सकते हैं, जैसे कि ?im (i केस असंवेदनशील है और m मल्टीलाइन है)।
    एफ Named capture groups: (?P<name>pattern), जिसे बाद में (?P=name) का उपयोग करके संदर्भित किया जा सकता है। .NET Regex इंजन इसके बजाय सिंटैक्स (?<name>pattern) का उपयोग करता है।
    जी Comments: (?#Comment text)। मुझे व्यक्तिगत रूप से लगता है कि यह सिर्फ अव्यवस्था को जोड़ता है, लेकिन मुझे लगता है कि यह कुछ उपयोग कर सकता है ... free-spacing mode एक बेहतर विकल्प हो सकता है ((?x) संशोधक)।

इसलिए अनिवार्य रूप से, ? का उद्देश्य केवल प्रासंगिक है।यदि आप एक शाब्दिक ( चरित्र के शून्य या अधिक दोहराव चाहते थे तो आपको माता-पिता से बचने के लिए \(? का उपयोग करना होगा।

+0

बिंदु # 3 के लिए, '(?> ...)' भी है, जो एक [परमाणु समूह] (http://www.regular-expressions.info/atomic.html) है जो इसका समर्थन करता है, और ' (? i) 'और' (? -i) 'इनलाइन सक्षम/अक्षम करने के लिए [modifiers] (http://www.regular-expressions.info/modifiers.html)। –

+0

@ डैनियल: धन्यवाद। मुझे लगता है कि मैं # 3 को साफ करने जा रहा हूं और कुछ लिंक के साथ एक सूची जोड़ रहा हूं, ताकि अन्य लोग भी इसमें शामिल रह सकें। – eldarerathis

+0

बस स्पष्टता के लिए, '(? Im)' दो मोड (केस असंवेदनशील और बहुमुखी) सक्षम करता है;) –

2

वे गैर-कैप्चरिंग कोष्ठक हैं। उनका उपयोग समूहकरण के लिए किया जाता है (जैसे सामान्य कोष्ठक की तरह) लेकिन समूह को कैप्चर सरणी में जोड़ा नहीं जाएगा (यानी यह \ n के साथ संदर्भित नहीं होगा)।

यहाँ देखें: http://www.regular-expressions.info/refadv.html

1

regex tutorial कि पर्ल के हर संस्करण के साथ स्थापित किया गया है देखें (विशेष रूप से, this section)।

7

$ perldoc perlreref:

(?:...) समूह subexpressions (क्लस्टर)

आप can also useYAPE::Regex::Explain पर कब्जा करने के बिना:

C:\\Temp> perl -MYAPE::Regex::Explain -e \ 
"print YAPE::Regex::Explain->new(qr#(?:\w+)#)->explain" 

The regular expression: 

(?-imsx:(?:\w+)) 

matches as follows: 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
(?-imsx:     group, but do not capture (case-sensitive) 
         (with^and $ matching normally) (with . not 
         matching \n) (matching whitespace and # 
         normally): 
---------------------------------------------------------------------- 
    (?:      group, but do not capture: 
---------------------------------------------------------------------- 
    \w+      word characters (a-z, A-Z, 0-9, _) (1 or 
          more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of grouping 
---------------------------------------------------------------------- 
)      end of grouping 
----------------------------------------------------------------------
2

संक्षेप में, अनुक्रम (? एक रेगुलर एक्सप्रेशन विशेष सुविधा शुरू होता है। (? का पालन करने वाली चीजें विशेष सुविधा निर्दिष्ट करती हैं, इस मामले में, एक गैर-कैप्चरिंग समूहिंग। हम इसे इंटरमीडिएट पर्ल और प्रभावी पर्ल प्रोग्रामिंग दोनों में शामिल करते हैं। perlre दस्तावेज़ पर्ल नियमित अभिव्यक्तियां।

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