Разбить строку на заглавную букву или цифры

9

Я пытался создать в машинописи канал, который бы разбивал строку PascalCase, но было бы неплохо, если бы это делилось и на цифры. Я также хотел бы, чтобы это делилось на последовательные заглавные буквы. У меня есть этот канал, который прекрасно работает, за исключением того, что он работает только в Chrome, а не в Firefox, очевидно, только Chrome поддерживает обратную сторону. Как это сделать без оглядки?

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. Это регулярное выражение также разделит строку camelCase, но это не обязательно учитывать.

develmatik
источник
.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 Рад, что работает, как хотелось бы, я только что прочитал об отличиях Camel от PascalCase :)
пузырьковый пузырь
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(' ')
);

1O1
источник