মূল অক্ষর বা সংখ্যার উপর একটি স্ট্রিং বিভক্ত করুন


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
@ (?!^)([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

@develmatik ভাল লাগছে এটা কাজ করে কাঙ্ক্ষিত, আমি শুধু উটের পার্থক্য সম্পর্কে পড়তে PascalCase :)
bobble বুদ্বুদ

3

কেবল কোনও বড় হাতের অক্ষর [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(' ')
);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.