2009-09-03 18 views
14

निम्नलिखित रेगेक्स एसटीस्ट्रिंग्स एफटीडब्ल्यू और ओडीपी के बीच पाठ पाता है।रेगेक्स: क्या (?! ...) मतलब है?

/FTW(((?!FTW|ODP).)+)ODP+/ 

(?! ... ) क्या करता है?

+0

यह पर्ल-विशिष्ट है (और PCRE), यह है नहीं? – tylerl

+1

@tylerl: यह किसी भी स्वाद पर लागू होता है जो लुकहेड का समर्थन करता है: पर्ल, पायथन, पीएचपी, .NET, जावा, जावास्क्रिप्ट, जेजीएसओफ्ट, एट अल। –

उत्तर

22

(?!regex)zero-width negative lookahead है। यह वर्तमान कर्सर की स्थिति और आगे के पात्रों का परीक्षण करेगा, परीक्षण करते हैं कि वे आपूर्ति किए गए रेगेक्स से मेल खाते हैं, और फिर कर्सर को वापस शुरू करने के लिए वापस लौटाते हैं।

पूरे regexp:

/ 
FTW   # Match Characters 'FTW' 
(   # Start Match Group 1 
    (   # Start Match Group 2 
    (?!FTW|ODP) # Ensure next characters are NOT 'FTW' or 'ODP', without matching 
    .    # Match one character 
)+   # End Match Group 2, Match One or More times 
)    # End Match Group 1 
OD   # Match characters 'OD' 
P+   # Match 'P' One or More times 
/

तो - FTW के लिए हंट, तो जबकि हमारे स्ट्रिंग समाप्त करने के लिए ODP+ की तलाश में कब्जा। भी सुनिश्चित करें कि FTW और ODP+ के बीच डेटा नहीं है FTW या ODP

+1

+1 के लिए धन्यवाद, यह समझाने के लिए कि यह आपूर्ति किए गए रेगेक्स में इसका उपयोग कैसे किया जा रहा है। –

7

इसका मतलब है "इसके बाद नहीं ..."। तकनीकी रूप से इसे negative lookahead कहा जाता है जिसमें आप इसे कैप्चर किए बिना स्ट्रिंग में आगे क्या देख सकते हैं। यह शून्य चौड़ाई के दावे का एक वर्ग है, जिसका अर्थ है कि इस तरह के अभिव्यक्ति अभिव्यक्ति के किसी भी भाग को कैप्चर नहीं करते हैं।

18

perldoc से:

एक शून्य चौड़ाई नकारात्मक लुक-आगे जोर। उदाहरण के लिए /foo(?!bar)/ "foo" की किसी भी घटना से मेल खाता है जिसके बाद "bar" नहीं होता है। ध्यान दें कि आगे देखो और पीछे की ओर एक ही बात नहीं है। आप इसे पीछे देखने के लिए उपयोग नहीं कर सकते हैं।

यदि आप "बार" की तलाश में हैं जो "foo" से पहले नहीं है, /(?!foo)bar/ जो भी आप चाहते हैं वह नहीं करेगा। ऐसा इसलिए है क्योंकि (?!foo) बस यह कह रहा है कि अगली बात "foo" नहीं हो सकती है - और ऐसा नहीं है, यह एक "बार" है, इसलिए "foobar" मिलान होगा। इसके लिए आपको /(?!foo)...bar/ जैसे कुछ करना होगा। हम "पसंद" कहते हैं क्योंकि आपके "bar" के मामले में इससे पहले तीन वर्ण नहीं हैं। आप इस तरह से कवर कर सकते हैं: /(?:(?!foo)...|^.{0,2})bar/। कभी कभी यह अभी भी आसान है सिर्फ इतना कहना है:

if (/bar/ && $` !~ /foo$/) 
+0

ऋणात्मक रूप से पीछे देखने के लिए, यदि पार्सर इसका समर्थन करता है तो आप वर्तमान स्थिति से पहले "सामान" मेल नहीं खाते हैं, यह जांचने के लिए आप केवल '(? Amber

+0

"Google आपका मित्र है" यदि आपको कुछ पता है कि खोज शब्द का उपयोग कैसे किया जाए। वैसे भी, क्या आप इस टुकड़े से लिंक करने का मतलब नहीं था? http://perldoc.perl.org/perlre.html#Look- लगभग-Assertions –

+0

इस मामले में मुझे लगता है कि regex दस्तावेज़ीकरण के लिए Google को जानना बहुत आसान है। हां, लिंक सुधार – mkoryak

0

'?!' वास्तव में '(?! ...)' का हिस्सा है, इसका मतलब है कि जो कुछ भी अंदर है वह उस स्थान से मेल नहीं खाता है।

3

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

/WTF(((?!WTF|ODP).)+)ODP+/ 
+2

Haters: चलो, थोड़ा सा हल्का करो। रेगेक्स को नफरत करने वाले कुछ लोगों पर यह एक एनाग्राम मजाक था। यद्यपि "सहायक" नहीं है, चलिए इसे यहां बहुत भरा नहीं है। नफरत से लड़ने के लिए – brianreavis

+0

+1। – nilamo

+1

जॉकी उत्तर डाउनवॉट्स को प्राप्त करने के लिए उत्तरदायी होते हैं, भले ही वे * सहायक हों; यह ठीक है कि यह यहाँ कैसे है। थोड़ा सा उपयोग करने के लिए उपयोग किया जाता है, लेकिन मुझे लगता है कि यह समग्र साइट गुणवत्ता के मामले में, इसके लायक है। –

2

Regex

/FTW(((?!FTW|ODP).)+)ODP+/ 

मैचों पहले FTW तुरंत FTW द्वारा और न ही ODP द्वारा न पीछा किया, तो सभी निम्न वर्ण पहली ODP (लेकिन अगर वहाँ FTW उन में कहीं है नहीं होगा कोई मिलान नहीं) तो सभी पत्र पी जो पालन करते हैं।

तो स्ट्रिंग में:

FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj

यह से मेल खाएगी बोल्ड हिस्सा

FTWFTWODPFTWjj FTWjjODPPPP jjODPPPjjj

+0

वहां आपके तर्क में थोड़ा त्रुटि है, चूंकि लुकहेड दावा '+ '' एड मैच समूह के अंदर है, यह एफटीडब्ल्यू के बीच किसी भी पाठ से मेल खाता है .... ओडीपी जो इसके अंदर एफटीडब्ल्यू या ओडीपी को संगत नहीं करता है। – gnarf

+0

@gnarf सही है: लालची या नहीं, यह regex कभी भी "एफटीडब्ल्यू" या "ओडीपी" की एक से अधिक घटना से मेल नहीं खाएगा। –

+0

आप सही हैं, मेरी गलती। मैं भविष्य के दर्शकों के भ्रम से बचने के लिए इसे ठीक कर रहा हूं। –

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