文字列を大文字または数字で分割する


9

私はPascalCase文字列を分割するtypescriptでパイプを作ろうとしていましたが、これも数字で分割するのが良いでしょう。また、連続した大文字で分割してほしい。私はこのパイプを使用していますが、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文字列を分割しますが、考慮する必要はありません。


.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+が、これは例えば破るABCDefg123A B C Defg 123変換することを、あなたの現在の機能に異なる作業されるであろうABC Defg 123

まだ少し違いがあります。あなたは、変換A1B2A 1B 2し、この1 A 1 B 2私はこの1つはそれではないだろう、より正確なことだと思うところ。


1
ブリリアント、私のすべてのテストケースに合格しました。私は同意します、あなたの方がより正確です。ほんとうにありがとう!
develmatik

必要に応じて、それが動作うれしい@develmatik、私はちょうどにキャメルの違いについて読んPascalCase :)
ボブルバブル

3

大文字[A-Z]または数字のシーケンスを\d+スペースに加えて、先ほど一致したものに置き換えるだけ" $1"です。文字列の先頭に負の先読みを追加して、結果の文字列の先頭にスペースが追加されないように、最初の文字をスキップします(?!^)

// ...

return value.replace(/(?!^)([A-Z]|\d+)/g, " $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.