Regex सभी प्रमुख टैब वर्णों को बदलने के लिए, प्रत्येक एक एकल स्थान के साथ [डुप्लिकेट]
मैं सभी प्रमुख टैब वर्णों को एक एकल स्थान (प्रत्येक प्रमुख टैब वर्ण के लिए एक स्थान) के साथ बदलने के लिए एक रेगेक्स की तलाश कर रहा हूं।
// input text with two leading tab characters and two tab characters elsewhere in the text
var input=" Some text containing tabs";
// A:
console.log(input.replace(/\t/g, "LEADING_TAB_"));
// prints: "LEADING_TAB_LEADING_TAB_Some textLEADING_TAB_LEADING_TAB_containing tabs"
// B:
console.log(input.replace(/\t/, "LEADING_TAB_"));
// prints: "LEADING_TAB_ Some text containing tabs"
// C:
console.log(input.replace(/^(\t)*/, "LEADING_TAB_"));
// prints: "LEADING_TAB_Some text containing tabs"
// D:
console.log(input.replace(/\t/gy, "LEADING_TAB_"));
// prints: "LEADING_TAB_LEADING_TAB_Some text containing tabs"
// E:
console.log(input.replace(/\t/y, "LEADING_TAB_"));
// prints: "LEADING_TAB_ Some text containing tabs"
इसे एक जेएस फिडेल में देखें: https://jsfiddle.net/onebcvu4/2/
उत्तर डी काम मेरे लिए।
input.replace(/\t/gy, " ")
लेकिन मैं सच में समझ में नहीं आता क्यों। विशेष रूप से, क्योंकि MDN प्रलेखन के अनुसार , वैश्विक (G) ध्वज को अनदेखा किया जाना चाहिए जब एक चिपचिपा ध्वज के साथ प्रयोग किया जाता है।
चिपचिपा और वैश्विक दोनों के रूप में परिभाषित एक नियमित अभिव्यक्ति वैश्विक ध्वज की उपेक्षा करती है।
किसी को भी क्लैरी कर सकते हैं या एक और समाधान प्रदान कर सकते हैं जो काम करता है?
जवाब
आपका उत्तर डी काम करता है (और काफी चालाक है) क्योंकि g
और अनन्य y
नहीं हैं , लेकिन यह सोचना उचित था कि वे होंगे। पूर्ण विवरण यहां और यहां के विनिर्देश में हैं , लेकिन जब तक कोई मैच होता है तब तक मौलिक रूप g
से replace
दोहराता है, और y
इसका मतलब है कि ए) अभिव्यक्ति केवल पर मेल खाती है lastIndex
(जो कि 0 में चूक), और बी) lastIndex
अपडेट नहीं है। इसलिए आप बार-बार \t
एट से मैच करते हैं lastIndex
और इसे तब तक बदल देते हैं जब तक कि आप रन आउट नहीं हो \t
जाते lastIndex
। बहुत चालाक।
यदि आप उस एक का उपयोग नहीं करना चाहते हैं, तो आप इसे एक प्रत्यावर्तन के साथ भी कर सकते हैं और पीछे एक सकारात्मक नज़र डाल सकते हैं:
const result = input.replace(/(?:^\t|(?<=^\t*)\t)/g, " ");
लाइव उदाहरण:
const input = "\t\tSome text\t\tcontaining tabs";
const result = input.replace(/(?:^\t|(?<=^\t*)\t)/g, " ");
console.log(JSON.stringify(result));
या यदि आप कॉलबैक पास करने के साथ ठीक हैं replace
, तो यह सरल है और इसे देखने की आवश्यकता नहीं है (जो अपेक्षाकृत नया है, ES2018): सभी प्रमुख \t
पात्रों से मेल खाएं और एक ही स्थान के स्ट्रिंग के साथ प्रतिस्थापित करें:
const result = input.replace(/^(\t+)/, match => " ".repeat(match.length));
लाइव उदाहरण:
const input = "\t\tSome text\t\tcontaining tabs";
const result = input.replace(/^(\t+)/, match => " ".repeat(match.length));
console.log(JSON.stringify(result));