Tách một chuỗi trên chữ in hoa hoặc số


9

Tôi đã cố gắng tạo một đường ống trong bản thảo để phân tách chuỗi PascalCase, nhưng thật tuyệt nếu điều này cũng sẽ phân chia theo các chữ số. Tôi cũng muốn nó để phân chia các chữ in hoa liên tiếp. Tôi có đường ống này, hoạt động rất tốt, ngoại trừ nó chỉ hoạt động trong Chrome chứ không phải Firefox, rõ ràng chỉ có Chrome hỗ trợ nhìn lại. Làm thế nào có thể thực hiện điều này mà không cần nhìn lại?

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

Vì vậy, ví dụ một chuỗi ANet15Amountnên được chuyển đổi thành A Net 15 Amount. Regex này ở trên cũng sẽ phân tách một chuỗi camelCase, nhưng điều đó không cần thiết phải xem xét.


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

2
@ibrahimmahrir (?!^)([A-Z]|\d+)tránh không gian đầu tiên và không cần cắt.
ctwheels

Câu trả lời:


6

Làm thế nào về kết hợp bởi một mô hình cơ bản hơn như thế nàytham gia với không gian.

let str = `ANet15Amount`;

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

console.log(camel);

Đầu tiên tôi nghĩ đơn giản [A-Z][a-z]*|\d+nhưng điều này sẽ phá vỡ ví dụ ABCDefg123vào A B C Defg 123đó sẽ là làm việc khác nhau với chức năng hiện tại của bạn, mà biến đổi để ABC Defg 123.

Vẫn có một chút khác biệt. Yours biến đổi A1B2để A 1B 2và một này để A 1 B 2mà tôi nghĩ cái này sẽ chính xác hơn, nó sẽ không.


1
Rực rỡ, vượt qua tất cả các trường hợp thử nghiệm của tôi. Tôi đồng ý, của bạn là chính xác hơn. Tôi rất trân trọng điều này!
develmatik

@develmatik Vui mừng vì nó hoạt động như mong muốn, tôi chỉ đọc về sự khác biệt của Camel với PascalCase :)
bong bóng bobble

3

Chỉ cần thay thế bất kỳ chữ cái viết hoa [A-Z]hoặc bất kỳ chuỗi chữ số nào \d+bằng một khoảng trắng cộng với những gì chúng ta vừa khớp " $1". Chúng tôi bỏ qua chữ cái đầu tiên để không có khoảng trắng nào được thêm vào lúc bắt đầu chuỗi kết quả bằng cách thêm một cái nhìn tiêu cực vào đầu chuỗi (?!^):

// ...

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

Thí dụ:


2

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

  • 0 hoặc 1 chữ cái viết hoa trực tiếp theo sau 1 hoặc nhiều chữ cái viết thường
  • hoặc 1 chữ hoa
  • hoặc 1 hoặc nhiều chữ số

Kiểm tra trong trình tạo: https://regex101.com/r/uBO0P5/1


2

Tôi đoán nó phụ thuộc vào quy ước của chuỗi có thể làm tăng độ phức tạp

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.