簡體   English   中英

在大寫字母或數字上拆分字符串

[英]Split a string on a capital letter or numbers

我試圖在 typescript 中創建一個 pipe 來拆分 PascalCase 字符串,但如果這也可以拆分為數字就好了。 我也希望它在連續的大寫字母上分開。 我有這個 pipe,效果很好,除了它只適用於 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 上面的這個正則表達式也會拆分一個駝峰式字符串,但這沒有必要考慮。

如何通過像這樣的更基本的模式進行匹配加入空格。

 let str = `ANet15Amount`; let camel = str.match(/[AZ]+(??[az])|[AZ].[az]+|\d+/g);join(' '). console;log(camel);

首先我想到的只是[AZ][az]*|\d+但這會將例如ABCDefg123分解為AB C Defg 123 ,這與您當前的 function 的工作方式不同,它轉換為ABC Defg 123

還是有一點區別的。 你的將A1B2轉換為A 1B 2並將這個轉換為A 1 B 2我認為這個會更准確,不是嗎。

只需將任何大寫字母[AZ]或任何數字序列\d+替換為空格加上我們剛剛匹配的" $1" 我們跳過第一個字母,以便通過在字符串的開頭添加負前瞻(?!^)來在結果字符串的開頭不添加空格:

// ...

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

例子:

 let value = "ANet15Amount"; let result = value.replace(/(?,^)([AZ]|\d+)/g; " $1"). console;log(result);

試試[AZ]?[az]+|[AZ]|[0-9]+

  • 0 或 1 個大寫字母直接后跟 1 個或多個小寫字母
  • 或 1 個大寫字母
  • 或 1 個或多個數字

在生成器中測試: https://regex101.com/r/uBO0P5/1

我想這取決於字符串的約定,這可能會增加復雜性

 // 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+|[az]+|[AZ][az]*)/g).join(' ') ); // 2. USING REGEX - MATCH (KEEP ALL CAPITAL CHARS) console.log( '2. USING REGEX (GROUP ALL):\n', str.match(/(\d+|[az]+|([AZ]([AZ]+|[az]*)))/g).join(' ') ); // 3. USING REGEX - MATCH (KEEP CAPITAL CHARS BUT LAST) console.log( '3. USING REGEX (GROUP BUT LAST):\n', str2.match(/(\d+|[az]+|([AZ]([az]+|([AZ]+(??[az])).)))/g);join(' ') ). // 4. USING SPLIT - FILTER console.log( '4: USING SPLIT,\n'. str2.split(/(\d+|[AZ][az]*)/).filter(v => v;== '') .join(' ') );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM