टेक्स्ट और रोजमर्रा के टूल · टेक्स्ट टूलकिट
क्यों ^ और $ केवल एक बार मेल खाते हैं: ब्राउज़र में रेगेक्स फ़्लैग ढूंढें और बदलें
· यह काम किस प्रकार करता है
रेगुलर-एक्सप्रेशन ढूँढें और बदलें पाठ-सफाई
JavaScript रेगेक्स फ़्लैग - ग्लोबल, मल्टीलाइन और डॉटऑल - समझाता है और पूरे टेक्स्ट में मल्टीलाइन एंकर ^ और $ के बिना एक फाइंड-एंड-रिप्लेस बॉक्स क्यों संकलित किया गया है, इसके बजाय काम करने वाले पैटर्न के साथ।
वह पैटर्न जिसने केवल पहली पंक्ति तय की - क्या होता है जब आप ^ का अर्थ 'प्रत्येक पंक्ति की शुरुआत' की अपेक्षा करते हैं
चिपकाई गई सूची में प्रत्येक पंक्ति पर समान अवांछित उपसर्ग हो सकता है, फिर भी `^prefix` की खोज करने से यह केवल पहली पंक्ति से हट जाता है। आश्चर्यजनक परिणाम पैटर्न कॉन्फ़िगरेशन से आता है, असंगत डेटा से नहीं। ToolAcre में, `^` पूर्ण पाठ की शुरुआत की पहचान करता है क्योंकि नियमित अभिव्यक्ति मल्टीलाइन मोड के बिना संकलित की जाती है।
मिलान करने वाला `$` एंकर दूसरे किनारे पर समान नियम का पालन करता है: यह संपूर्ण पाठ के अंत की पहचान करता है, न कि उसके अंदर समाप्त होने वाली प्रत्येक पंक्ति की। एक लाइन ब्रेक इनपुट का हिस्सा बना रहता है, लेकिन यह दूसरी एंकर स्थिति नहीं बन जाता है। साफ़ की गई सूची आयात करने से पहले रिपोर्ट की गई प्रतिस्थापन संख्या की जाँच करें; एक की गिनती से बेमेल तुरंत उजागर हो जाता है।
जी ध्वज - 'प्रत्येक मैच को एक पास में क्यों बदलें' वैश्विक ध्वज सेट होने पर निर्भर करता है
ToolAcre हमेशा वैश्विक `g` ध्वज के साथ अपना खोज पैटर्न बनाता है। वह विकल्प JavaScript को पहले वाले के बाद रुकने के बजाय प्रत्येक गैर-अतिव्यापी मैच को इकट्ठा करने के लिए कहता है। गिनती निर्धारित करने के लिए टूल पहले `match` को कॉल करता है, फिर उसी वैश्विक पैटर्न को `replace` पर पास करता है, इसलिए प्रदर्शित संख्या और प्रतिस्थापन पास एक मिलान नियम का उपयोग करते हैं।
वैश्विक मिलान ऐसी स्थिति नहीं बना सकता जिसे पैटर्न पहचान न सके। `^prefix` के साथ, केवल एक योग्य संपूर्ण-पाठ प्रारंभ है, इसलिए `g` को अभी भी एक मिलान मिलता है। एक पैटर्न के साथ जो कई पंक्तियों पर हो सकता है, `g` सभी घटनाओं को प्रतिस्थापित करने की अनुमति देता है। डिबगिंग करते समय इन प्रश्नों को अलग करें: एंकर तय करते हैं कि मैच कहां से शुरू हो सकता है, जबकि वैश्विक मोड यह तय करता है कि खोज जारी रहेगी या नहीं।
एम फ़्लैग - मल्टीलाइन कैसे ^ और $ को संपूर्ण-पाठ एंकर से लाइन एंकर में बदलता है, और यह टूल इसे क्यों छोड़ देता है
मल्टीलाइन `m` ध्वज `^` और `$` की व्याख्या करने के तरीके को बदल देता है, जिससे उन्हें लाइन टर्मिनेटर के आसपास की स्थिति के साथ-साथ बाहरी पाठ सीमाओं को पहचानने की अनुमति मिलती है। ToolAcre उस ध्वज को नहीं जोड़ता है। इसका कंपाइलर केस-संवेदी खोजों के लिए `g` और केस संवेदनशीलता साफ़ होने पर `gi` का उपयोग करता है, अतिरिक्त फ़्लैग के लिए कोई उपयोगकर्ता नियंत्रण नहीं होता है।
मल्टीलाइन को अनुपलब्ध छोड़ने से इंटरफ़ेस छोटा रहता है, लेकिन इसका मतलब है कि `gm` के साथ कॉन्फ़िगर किए गए एडिटर से कॉपी किए गए पैटर्न यहां अलग तरह से व्यवहार कर सकते हैं। यह मत समझिए कि एक परिचित अभिव्यक्ति अपने झंडे साथ लेकर चलती है। JavaScript जब RegExp बनाया जाता है तो फ़्लैग अक्षर प्रदान किए जाते हैं, और यह टूल किसी अन्य मोड को चुपचाप सक्षम करने के बजाय असमर्थित इनलाइन फ़्लैग सिंटैक्स को अस्वीकार कर देता है।
एस ध्वज - क्यों एक बिंदु डिफ़ॉल्ट रूप से एक नई पंक्ति से मेल नहीं खाता है, और इसके बिना लाइनों में कैसे मिलान किया जाए
इस टूल में एक बिंदु लाइन ब्रेक से मेल नहीं खाता है क्योंकि कंपाइलर dotAll `s` ध्वज को भी छोड़ देता है। `BEGIN.*END` जैसा पैटर्न तब मेल खा सकता है जब दोनों मार्कर एक लाइन पर हों, लेकिन जब मार्कर कई पंक्तियों में फैले होते हैं तो यह पहली लाइन ब्रेक पर रुक जाता है। वैश्विक मोड जोड़ने से यह नहीं बदलता कि डॉट स्वयं क्या उपभोग कर सकता है।
जब क्रॉस-लाइन मिलान वास्तव में आवश्यक हो, तो अनुमत वर्णों को स्पष्ट रूप से लिखें। `[\s\S]*?` जैसी कक्षा अनिच्छुक रहते हुए व्हाइटस्पेस और गैर-व्हाट्सएप का विस्तार कर सकती है, हालांकि व्यापक पैटर्न पहले एक छोटे नमूने पर परीक्षण के लायक हैं। कंपाइलर अमान्य सिंटैक्स को पकड़ता है, लेकिन यह टैब को गंभीर बैकट्रैकिंग व्यवहार वाले महंगे एक्सप्रेशन से नहीं बचाता है।
नई लाइनों का स्पष्ट रूप से मिलान करना - मल्टीलाइन अनुपलब्ध होने पर लक्ष्य रेखा के पैटर्न में \n का उपयोग शुरू और समाप्त होता है
मल्टीलाइन मोड के बिना बार-बार शुरू होने वाली लाइन के लिए, टेक्स्ट की शुरुआत या नई लाइन से मिलान करें: `(^|\n)prefix`। पहला विकल्प पहली पंक्ति को संभालता है, और दूसरा बाद की पंक्तियों को उनकी पिछली नई लाइन का उपभोग करके संभालता है। कोष्ठक उस सीमा को पकड़ लेते हैं जो मेल खाती है, जिससे प्रतिस्थापन को उस संरचना को बनाए रखने का एक तरीका मिलता है जो रेखाओं को अलग करती है।
यह तकनीक पैटर्न में लाइन-फ़ीड विभाजक मानती है। समर्पित लाइन संचालन करते समय टेक्स्ट लाइब्रेरी CRLF, LF और लोन CR को पहचानती है, लेकिन मूल स्ट्रिंग को सीधे खोजती है और प्रतिस्थापित करती है। यदि चिपकाई गई सामग्री किसी अन्य लाइन-एंडिंग फॉर्म का उपयोग करती है, तो पहले इसे सामान्य करें या जानबूझकर अभिव्यक्ति को अनुकूलित करें; अन्यथा बाद की पंक्तियाँ अछूती रह सकती हैं भले ही वे स्क्रीन पर समान दिखें।
लाइन की सीमाओं को (^|\n) के साथ स्पष्ट रूप से मिलाएं और कैप्चर किए गए विभाजक को सुरक्षित रखें
मान लीजिए कि इनपुट अलग-अलग लाइनों पर `ID: apple`, `ID: pear`, और `ID: plum` है। रेगेक्स सक्षम करें, `(^|\n)ID: ` ढूंढें, और `$1` से बदलें। पहली पंक्ति पर, `$1` खाली प्रारंभ स्थिति है; बाद की पंक्तियों में, यह कैप्चर की गई नई लाइन है। लेबल गायब हो जाते हैं जबकि तीनों पंक्तियों की सीमाएँ यथावत रहती हैं।
परिणाम स्वीकार करने से पहले प्रतिस्थापन गणना पढ़ें। इस उदाहरण में तीन पंक्तियों से तीन प्रतिस्थापन होने चाहिए। यदि गिनती एक है, तो ऑपरेशन को दोहराने के बजाय वास्तविक पैटर्न और लाइन अंत का निरीक्षण करें। प्रतिस्थापन के बाद पूर्ववत करना उपलब्ध है, इसलिए एक ही अभिव्यक्ति लंबी आयात सूची को छूने से पहले एक छोटा परीक्षण मिलान और पुनर्निर्माण दोनों की पुष्टि कर सकता है।
इसमें क्या शामिल नहीं है - यू, आई और वाई झंडे, और प्रतिस्थापन में नई लाइनें डालना, जो एक एकल-पंक्ति फ़ील्ड नहीं कर सकती
केस संवेदनशीलता बंद होने पर कार्यान्वयन `i` का भी उपयोग करता है, लेकिन यह `u`, `y`, `m`, या `s` के लिए कोई नियंत्रण नहीं दिखाता है। यह आलेख उदाहरण के लिए आवश्यक लापता मल्टीलाइन और डॉटऑल प्रभावों को समझाने के अलावा उन अनुपलब्ध मोडों के लिए व्यवहार निर्दिष्ट नहीं करता है। किसी अन्य JavaScript परिवेश के पैटर्न की समीक्षा वास्तव में संकलित ToolAcre फ़्लैग के विरुद्ध की जानी चाहिए।
स्रोत साबित करता है कि प्रतिस्थापन पाठ JavaScript `String.replace` को भेज दिया गया है, इसलिए `$1`, `$&`, और `$$` जैसे प्रतिस्थापन अपने JavaScript अर्थ बनाए रखते हैं। यह यहां उपयोग की गई फ़ाइलों से प्रस्तुत फ़ील्ड द्वारा प्रस्तुत प्रत्येक इंटरैक्शन को स्थापित नहीं करता है। विशेष रूप से, केवल रूपरेखा से अनुमान लगाने के बजाय इंटरफ़ेस के माध्यम से भौतिक नई लाइनें डालने का परीक्षण किया जाना चाहिए।
अन्य झंडे और प्रतिस्थापन-क्षेत्र व्यवहार इस टूल कार्यान्वयन से बाहर हैं
फ़्लैग को नियमित अभिव्यक्ति के भाग के रूप में मानें, तब भी जब कोई इंटरफ़ेस केवल पैटर्न बॉडी प्रदर्शित करता है। ToolAcre में, प्रत्येक खोज वैश्विक है, वैकल्पिक केस-असंवेदनशील मोड `i` जोड़ता है, और मल्टीलाइन और डॉटऑल अनुपस्थित हैं। वे तथ्य बताते हैं कि सामान्य मैचों में प्रतिस्थापन क्यों जारी रहता है जबकि `^`, `$`, और dot अपने डिफ़ॉल्ट संपूर्ण-पाठ और एकल-पंक्ति बाधाओं को बनाए रखते हैं।
पहले से चिपकाई गई सूची के लिए, `$1` के साथ `(^|\n)prefix` व्यावहारिक समाधान है क्योंकि यह सीमा को नाम देता है और उसे संरक्षित करता है। प्रतिनिधि पंक्तियों से प्रारंभ करें, गिनती की पुष्टि करें, परिणामी पंक्ति संरचना का निरीक्षण करें, और उसके बाद ही पूर्ण डेटासेट को संसाधित करें। यह प्रक्रिया एक हैरान कर देने वाले एक-मैच के परिणाम को आयात से पहले समीक्षा योग्य सफ़ाई चरण में बदल देती है।