Regex सभी प्रमुख टैब वर्णों को बदलने के लिए, प्रत्येक एक एकल स्थान के साथ [डुप्लिकेट]

Nov 24 2020

मैं सभी प्रमुख टैब वर्णों को एक एकल स्थान (प्रत्येक प्रमुख टैब वर्ण के लिए एक स्थान) के साथ बदलने के लिए एक रेगेक्स की तलाश कर रहा हूं।

// 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) ध्वज को अनदेखा किया जाना चाहिए जब एक चिपचिपा ध्वज के साथ प्रयोग किया जाता है।

चिपचिपा और वैश्विक दोनों के रूप में परिभाषित एक नियमित अभिव्यक्ति वैश्विक ध्वज की उपेक्षा करती है।

किसी को भी क्लैरी कर सकते हैं या एक और समाधान प्रदान कर सकते हैं जो काम करता है?

जवाब

2 T.J.Crowder Nov 24 2020 at 14:46

आपका उत्तर डी काम करता है (और काफी चालाक है) क्योंकि 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));