2012-06-06 16 views
9

मैं कोड का एक टुकड़ा समझने की कोशिश कर रहा हूं और PHP की preg_replace फ़ंक्शन में उपयोग की जाने वाली इस नियमित अभिव्यक्ति में आया हूं।नियमित अभिव्यक्ति (? <! -) का अर्थ क्या है

'/(?<!-)color[^{:]*:[^{#]*$/i' 

इस बिट ... (?<!-) नहीं करता है मेरी रेग-exp मैनुअल में से किसी में दिखाई देते हैं। किसी को पता है कि इसका मतलब क्या है? (Google कुछ भी वापस नहीं करता है - मुझे लगता है कि प्रतीक Google में काम नहीं करते हैं।)

+6

यह बाईं आंख में मारा बैटमैन दुश्मन लेकिन वैसे भी मुस्कुरा के एक स्माइली –

+0

(लेकिन यह किसी को भी एक ऐसी ही टोपी पहने से मेल खाएगी) संदर्भ के लिए है ... [चारों-ओर इस प्रकार के दावे] (http: // perldoc perlre से .perl.org/perlre.html # लुक-ए-एसेरशन), [सकारात्मक और नकारात्मक लुकबींड] (http://www.regular-expressions.info/lookaround.html#lookbehind) नियमित-expressions.info पर। – outis

उत्तर

10

?<! एक मूलभूत समूह की शुरुआत में negative lookbehind है। यह दावा करता है कि color शब्द (कड़ाई से, c इंजन में) - चरित्र से पहले नहीं था।

तो, एक और अधिक ठोस उदाहरण के लिए, यह color तार में से मेल होगा:

color 
+color 
someTextColor 

लेकिन यह -color या background-color की तरह कुछ पर विफल हो जाएगा। यह भी ध्यान रखें कि इंजन c से पहले जो भी "मैच" नहीं करेगा, यह केवल दावा करता है कि यह एक हाइफ़न नहीं है। यह संदर्भ के आधार पर एक महत्वपूर्ण भेद हो सकता है (illustrated on Rubular with a trivial example; ध्यान दें कि केवल अंतिम स्ट्रिंग में b मिलान किया गया है, पिछले अक्षर नहीं)।

6

PHP preg_ * फ़ंक्शंस के लिए perl संगत नियमित अभिव्यक्तियों (पीसीआरई) का उपयोग करता है। perldoc perlre से:

"(?<!pattern)"
एक शून्य चौड़ाई नकारात्मक लुक-पीछे अभिकथन। उदाहरण के लिए
"/(?<!bar)foo/" "foo" की किसी भी घटना से मेल खाता है जो
"bar" का पालन नहीं करता है। केवल फिक्स्ड-चौड़ाई के लिए काम करता है-
पीछे।

+0

आप [पीसीआरई] (http://pcre.org/pcre.txt) का उद्धरण क्यों नहीं देते? – Gumbo

+0

@ गंबो - यह बेहतर होगा। मैंने perldoc का हवाला दिया क्योंकि मुझे पता था कि जानकारी कहां मिलनी है। – jordanm

4

मैं पाइथन के पुनः मॉड्यूल का उपयोग करके नियमित अभिव्यक्ति सीख रहा हूं!

http://docs.python.org/library/re.html

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

+1

पायथन रेगेक्स पीसीआरई की तरह पीसीआरई नहीं है। – jordanm

+0

समझने योग्य, मैंने सोचा कि मैं एक और नियमित अभिव्यक्ति लाइब्रेरी इंगित करता हूं, मैं नियमित अभिव्यक्तियों के लिए नया हूं इसलिए मैं सबसे बड़ी भाषाओं में नियमित अभिव्यक्तियों के बारे में जितना सीख सकता हूं, इसलिए मैंने सोचा कि मैं बताऊंगा अजगर की। – richardhsu