문자열을 대문자로 나눕니다


9

PascalCase 문자열을 분할하는 파이프를 typescript로 만들려고했지만 숫자로도 분할하면 좋을 것입니다. 나는 또한 연속 된 대문자로 나누기를 원합니다. 이 파이프는 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 문자열을 분리하지만 고려할 필요는 없습니다.


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

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.

여전히 약간의 차이가 있습니다. 당신의 변환 A1B2A 1B 2및이 하나 A 1 B 2나는이 일이없는 것, 더 정확한 것 같아요 곳.


1
훌륭합니다. 모든 테스트 사례를 통과했습니다. 나는 당신의 것이 더 정확하다는 것에 동의합니다. 정말 감사!
develmatik

@develmatik 다행이 원하는대로, 난 그냥에 낙타의 차이에 대해 읽어 작동 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(' ')
);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.