Bir dizeyi büyük harf veya rakamlara bölme


9

Bir PascalCase dizesini bölecek patlama yazı tipinde bir boru yapmaya çalışıyordum, ama bu da rakamlar üzerinde de bölünürse güzel olurdu. Ayrıca ardışık büyük harflere bölünmesini de istiyorum. Harika çalışan bu boruya sahibim, ancak Firefox'ta değil, yalnızca Chrome'da çalışıyor, sadece Chrome'un arkası olanları destekliyor. Geriye bakmadan bunu nasıl başarabilirim?

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;
    }

Örneğin, bir dize ANet15Amountdönüştürülmelidir A Net 15 Amount. Yukarıdaki bu normal ifade ayrıca bir camelCase dizesini böler, ancak bu dikkate alınması gerekmez.


.replace(/([A-Z]|\d+)/g, " $1").trim();
ibrahim mahrir

2
@ibrahimmahrir (?!^)([A-Z]|\d+)ilk alandan kaçınır ve trim gerektirmez.
ctwheels

Yanıtlar:


6

Bunun gibi daha temel bir kalıpla eşleşmeye ve boşlukla birleşmeye ne dersiniz ?

let str = `ANet15Amount`;

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

console.log(camel);

İlk önce basitçe düşündüm [A-Z][a-z]*|\d+ama bu, örneğin şu anki fonksiyonunuza göre farklılaşacak olan ve bu da dönüşüme ABCDefg123dönüşecekti .A B C Defg 123ABC Defg 123

Hala küçük bir fark var. Sevgiler dönüşümler A1B2için A 1B 2ve bu bir A 1 B 2ben bu bir saymazlar daha doğru olacağını düşünüyorum nerede.


1
Harika, tüm test senaryolarımı geçtim. Katılıyorum, seninki daha doğru. Gerçekten onu takdir ederim!
develmatik

@develmatik İstendiği gibi çalışıyor sevindim, sadece Camel ile PascalCase arasındaki farkları okudum :)
bobble bubble

4

Herhangi bir büyük harf [A-Z]veya rakam dizisini \d+bir boşluk artı eşleştirdiklerimizle değiştirin " $1". İlk harfi atlayarak dizenin başlangıcına negatif bir ileri okuma ekleyerek sonuçtaki dizenin başına boşluk eklenmeyecektir (?!^):

// ...

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

Misal:


2

Deneyin [A-Z]?[a-z]+|[A-Z]|[0-9]+

  • 0 veya 1 büyük harf doğrudan ardından 1 veya daha fazla küçük harf
  • veya 1 büyük harf
  • veya 1 veya daha fazla basamak

Jeneratörde test: https://regex101.com/r/uBO0P5/1


2

Sanırım bu, karmaşıklığı artırabilecek dizenin kurallarına bağlı

// 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(' ')
);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.