!rm`.*$
एक एकल रेगेक्स के साथ, रेटिना मैच मोड में चलता है। यह आम तौर पर मैचों की संख्या को प्रिंट करता है, लेकिन साथ!
हम वास्तविक मैचों को प्रिंट करने के लिए कॉन्फ़िगर करते हैं (इसके बजाय लाइनफीड द्वारा अलग)।
वास्तविक रेगेक्स मात्र है .*$
। .*
किसी भी लाइन (संभावित रूप से खाली) से मेल खाता है, क्योंकि .
लाइनफीड को छोड़कर किसी भी चरित्र से मेल खा सकता है। मैं ले आता हूँ$
एक मिनट में ।
हम इसे रिवर्स में मैचों को कैसे प्रिंट करते हैं? .NET के दाएं-से-बाएं मिलान मोड का उपयोग करके, के साथ सक्रिय किया गयाr
। इसका मतलब है कि रेग्क्स इंजन मैच की तलाश में स्ट्रिंग के अंत में शुरू होता है और पीछे की ओर काम करता है।
अंत में, स्ट्रिंग के अंत के बजाय मैच को एक पंक्ति का अंत m
बनाता है । हमें भी इसकी आवश्यकता क्यों है? मुसीबत यह है कि बाहर के मैचों को उत्पन्न करता है। रेगेक्स प्रतिस्थापन पर विचार करें$
.*
s/a*/$0x/
इनपुट पर लागू किया गया baaababaa
। आपको लगता है कि यह उपज होगा baaaxbaxbaax
, लेकिन यह वास्तव में आपको देता है baaaxxbaxxbaaxx
। क्यूं कर? क्योंकि मिलान aaa
के बाद इंजन का कर्सर a
और के बीच होता है b
। अब यह किसी भी अधिक मेल नहीं खा सकता है a
, लेकिन a*
एक खाली स्ट्रिंग के साथ भी संतुष्ट है। इसका मतलब है, हर एक मैच के बाद आपको एक और खाली मैच मिलेगा।
हम यहां यह नहीं चाहते हैं, क्योंकि यह अतिरिक्त खाली लाइनों को पेश करेगा, इसलिए हम उन एक्सट्रॉनिक मैचों (जो दाएं-से-बाएं मोड के कारण लाइनों की शुरुआत में हैं) को त्याग देते हैं, उस मैचों को समाप्त करने की आवश्यकता होती है रेखा।
tac
एक अजीब सा है जब यह लाइनिंग फीडफुल की बात आती है। यहa\nb\n
(अनुगामी लाइनफीड) को (b\na\n
औरa\nb
अनुगामी लाइनफीड को) में बदल देता हैba\n
। क्या यह है कि हमारे कोड को कैसे व्यवहार करना चाहिए?