कैपिटल लेटर या नंबरों पर एक स्ट्रिंग विभाजित करें


9

मैं टाइपस्क्रिप्ट में एक पाइप बनाने की कोशिश कर रहा था जो पास्कलकेस स्ट्रिंग को विभाजित करेगा, लेकिन यह अच्छा होगा अगर यह अंकों पर भी विभाजित होगा। मैं चाहूंगा कि यह लगातार बड़े अक्षरों में विभाजित हो। मेरे पास यह पाइप है, जो बहुत अच्छा काम करता है, सिवाय इसके कि यह केवल क्रोम में काम करता है और फ़ायरफ़ॉक्स में नहीं, जाहिर है कि केवल क्रोम बैक का समर्थन करता है। बिना लुक बैक के इसे कैसे पूरा किया जा सकता है?

transform(value: string): string {
        let extracted = '';
        if (!value) {
            return extracted;
        }

        const regExSplit = value
            .split(new RegExp('(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[0-9])(?=[A-Z][a-z])|(?<=[a-zA-Z])(?=[0-9])'));
        for (let i = 0; i < regExSplit.length; i++) {
            if (i !== regExSplit.length - 1) {
                extracted += `${regExSplit[i]} `;
            } else {
                extracted += regExSplit[i];
            }
        }

        return extracted;
    }

तो उदाहरण के लिए एक स्ट्रिंग ANet15Amountमें तब्दील किया जाना चाहिए A Net 15 Amount। ऊपर का यह रेगेक्स भी कैमलकेस स्ट्रिंग को विभाजित करेगा, लेकिन इस पर विचार करना आवश्यक नहीं है।


.replace(/([A-Z]|\d+)/g, " $1").trim();
इब्राहिम माहिर

2
@ibrahimmahrir (?!^)([A-Z]|\d+)पहले स्थान से बचता है और उसे ट्रिम की आवश्यकता नहीं है।
ctwheels

जवाबों:


6

कैसे इस तरह के एक और अधिक बुनियादी पैटर्न द्वारा मिलान और अंतरिक्ष के साथ जुड़ने के बारे में।

let str = `ANet15Amount`;

let camel = str.match(/[A-Z]+(?![a-z])|[A-Z]?[a-z]+|\d+/g).join(' ');

console.log(camel);

सबसे पहले मैं बस के बारे में सोचा [A-Z][a-z]*|\d+है, लेकिन इस उदाहरण के लिए टूट जाएगा ABCDefg123में A B C Defg 123जो अपने वर्तमान कार्य करने के लिए अलग अलग काम कर रहे हैं, कि रूपांतरण करने के लिए किया जाएगा ABC Defg 123

अभी भी थोड़ा अंतर है। तुम्हारा बदल A1B2जाता है A 1B 2और यह एक है A 1 B 2जहाँ मुझे लगता है कि यह एक और अधिक सटीक होगा, यह नहीं होगा।


1
शानदार, मेरे सभी परीक्षण मामलों को पारित कर दिया। मैं सहमत हूँ, तुम्हारा अधिक सटीक है। मैं वास्तव में इसकी प्रशंसा करता हूँ!
डेवेलमेटिक

@develmatik Glad यह वांछित के रूप में काम करता है, मैंने अभी कैमल से पास्कलकेस के अंतर के बारे में पढ़ा :)
बबल

4

बस किसी भी बड़े अक्षर [A-Z]या अंकों के किसी भी क्रम को \d+एक स्थान के साथ बदलें, जो कि हम अभी-अभी मेल खाते हैं " $1"। हम पहले अक्षर को छोड़ देते हैं ताकि स्ट्रिंग की शुरुआत में नकारात्मक लुकहेड जोड़कर परिणामी स्ट्रिंग की शुरुआत में कोई स्थान न जोड़ा जाए (?!^):

// ...

return value.replace(/(?!^)([A-Z]|\d+)/g, " $1");

उदाहरण:


2

प्रयत्न [A-Z]?[a-z]+|[A-Z]|[0-9]+

  • 0 या 1 अपरकेस अक्षर सीधे 1 या अधिक लोअरकेस अक्षरों के बाद
  • या 1 बड़ा अक्षर
  • या 1 या अधिक अंक

जनरेटर में टेस्ट: https://regex101.com/r/uBO0P5/1


2

मुझे लगता है कि यह स्ट्रिंग के सम्मेलनों पर निर्भर करता है जिससे जटिलता बढ़ सकती है

// here 'TIMES' & 'with' are seperated (example 2)
const str = 'SplittingStringsIsFunTimesA100000aaaTIMESwithFollowUp';

// here 'TIMES' & 'With' are seperated (exmpaple 3)
const str2 = 'SplittingStringsIsFunTimesA100000aaaTIMESWithCAPITAL5FollowUp';


// 1. USING REGEX - MATCH
console.log(
  '1. USING REGEX:\n',
  str
  .match(/(\d+|[a-z]+|[A-Z][a-z]*)/g)
  .join(' ')
);


// 2. USING REGEX - MATCH (KEEP ALL CAPITAL CHARS)
console.log(
  '2. USING REGEX (GROUP ALL):\n',
  str
  .match(/(\d+|[a-z]+|([A-Z]([A-Z]+|[a-z]*)))/g)
  .join(' ')
);

// 3. USING REGEX - MATCH (KEEP CAPITAL CHARS BUT LAST)
console.log(
  '3. USING REGEX (GROUP BUT LAST):\n',
  str2
  .match(/(\d+|[a-z]+|([A-Z]([a-z]+|([A-Z]+(?![a-z]))?)))/g)
  .join(' ')
);


// 4. USING SPLIT - FILTER
console.log(
  '4. USING SPLIT:\n',
  str2
  .split(/(\d+|[A-Z][a-z]*)/)
  .filter(v => v !== '')
  .join(' ')
);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.