簡體   English   中英

正則表達式拆分駝峰案例

[英]Regex to split camel case

我在 JavaScript 中有一個正則表達式,可以使用以下代碼(我隨后從此處獲得)在大寫字母處拆分我的駝峰式大小寫字符串:

"MyCamelCaseString"
    .replace(/([A-Z])/g, ' $1')
    .replace(/^./, function(str){ return str.toUpperCase(); })

因此返回:

"My Camel Case String"

哪個好。 但是,我想更上一層樓。 有人可以幫助我使用正則表達式,當且僅當前一個字符為小寫而后者為大寫時,它才會拆分。

因此,上面的例子將是我期望的結果,但如果我這樣做:

"ExampleID"

然后我得到了回報:

"Example ID"

代替

"Example I D"

因為它在每個大寫字母處拆分並忽略它之前的任何內容。

希望這是有道理的! 並感謝:)。

我的猜測是將/([AZ])/替換為/([az])([AZ])/並將' $1'替換為'$1 $2'

"MyCamelCaseString"
    .replace(/([a-z])([A-Z])/g, '$1 $2');

/([a-z0-9])([AZ])/對於算作小寫字符的數字

 console.log("MyCamelCaseStringID".replace(/([a-z0-9])([AZ])/g, '$1 $2'))

"MyCamelCaseString".replace(/([a-z](?=[A-Z]))/g, '$1 ')

輸出:

"My Camel Case String"

如果您想要一組小寫單詞:

"myCamelCaseString".split(/(?=[A-Z])/).map(s => s.toLowerCase());

如果你想要一串小寫單詞:

"myCamelCaseString".split(/(?=[A-Z])/).map(s => s.toLowerCase()).join(' ');

如果要分隔單詞但保留大小寫:

"myCamelCaseString".replace(/([a-z])([A-Z])/g, '$1 $2')

有時,camelCase 字符串包含縮寫,例如:

PDFSplitAndMergeSamples
PDFExtractorSDKSamples
PDFRendererSDKSamples
BarcodeReaderSDKSamples

在這種情況下,以下函數將起作用,它將字符串拆分為單獨的字符串:

function SplitCamelCaseWithAbbreviations(s){
   return s.split(/([A-Z][a-z]+)/).filter(function(e){return e});
}

例子:

 function SplitCamelCaseWithAbbreviations(s){ return s.split(/([AZ][az]+)/).filter(function(e){return e}); } console.log(SplitCamelCaseWithAbbreviations('PDFSplitAndMergeSamples')); console.log(SplitCamelCaseWithAbbreviations('PDFExtractorSDKSamples')); console.log(SplitCamelCaseWithAbbreviations('PDFRendererSDKSamples')); console.log(SplitCamelCaseWithAbbreviations('BarcodeReaderSDKSamples'));

我發現這個問題的所有答案都沒有真正適用於所有情況,也不適用於 unicode 字符串,所以這里有一個可以做所有事情的答案,包括破折號和下划線符號拆分。

 let samples = [ "ThereIsWay_too MuchCGIInFilms These-days", "UnicodeCanBeCAPITALISEDTooYouKnow", "CAPITALLetters at the StartOfAString_work_too", "As_they_DoAtTheEND", "BitteWerfenSie-dieFußballeInDenMüll", "IchHabeUberGesagtNichtÜber", "2BeOrNot2Be", "ICannotBelieveThe100GotRenewed. It-isSOOOOOOBad" ]; samples.forEach(sample => console.log(sample.replace(/([^[\\p{L}\\d]+|(?<=[\\p{Ll}\\d])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{Ll}\\d])|(?<=[\\p{L}\\d])(?=\\p{Lu}[\\p{Ll}\\d]))/gu, '-').toUpperCase()));

如果您不想將數字視為小寫字母,則:

 let samples = [ "2beOrNot2Be", "ICannotBelieveThe100GotRenewed. It-isSOOOOOOBad" ]; samples.forEach(sample => console.log(sample.replace(/([^\\p{L}\\d]+|(?<=\\p{L})(?=\\d)|(?<=\\d)(?=\\p{L})|(?<=[\\p{Ll}\\d])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}\\p{Ll})|(?<=[\\p{L}\\d])(?=\\p{Lu}\\p{Ll}))/gu, '-').toUpperCase()));

也可以使用正則表達式非單詞邊界\\B字符

 console.log("MyCamelCaseString".replace(/(\\B[AZ])/g, ' $1'));

嗨,我沒有看到現場演示,謝謝@michiel-dral

 var tests =[ "camelCase", "simple", "number1Case2"] function getCamelCaseArray(camel) { var reg = /([a-z0-9])([AZ])/g; return camel.replace(reg, '$1 $2').split(' '); } function printTest(test) { document.write('<p>'+test + '=' + getCamelCaseArray(test)+'</p>'); } tests.forEach(printTest);
 <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="style.css"> <script src="script.js"></script> </head> <body> </body> </html>

我更喜歡使用數組而不是字符串。 調試更容易,更靈活。 這是一個實際的join而不是replace 我還沒有處理字符串中的空格,但您可以輕松地修剪每個元素。

 const splitCamelCase = str => str.match(/^[AZ]?[^AZ]*|[AZ][^AZ]*/g).join(' '); console.log(splitCamelCase('fooMyCamelCaseString')); console.log(splitCamelCase('MyCamelCaseString')); console.log(splitCamelCase('XYZMyCamelCaseString')); console.log(splitCamelCase('alllowercase'));

如果你像我一樣有一個camelCase值,例如:

thisIsMyCamelCaseValue其中第一個字母是小寫的

function fromCamelCase(value) {
    const spaced = value.replace(/([a-z])([A-Z])/g, '$1 $2');
    return spaced.charAt(0).toUpperCase() + spaced.slice(1);
}

您可以組合使用regExreplacetrim

"ABCMyCamelCaseSTR".replace(/([A-Z][a-z0-9]+)/g, ' $1 ')
                   .replace(/\s{2}/g," ").trim()

// ABC My Camel Case STR
a = 'threeBlindMice'
a.match(/[A-Z]?[a-z]+/g) // [ 'three', 'Blind', 'Mice' ]

是我發現的最簡單的方法,用於簡單的駱駝/標題分割。

如果您還想大寫並在數字之間添加空格,這很有效。

const str = 'this1IsASampleText';
str.charAt(0).toUpperCase() + value.slice(1); // Capitalize the first letter
str.replace(/([0-9A-Z])/g, ' $&'); // Add space between camel casing

結果:

This 1 Is A Sample Text    

我最近遇到了這個問題,需要做同樣的事情:

員工ID應呈現為員工 ID

我發現zellwk 的這個 轉換案例庫加上一些額外的 reduce 函數對我有用:

import { toTitle } from "./convert-case.js";

// NB. Assumes sequential single chars can be concatenated
// ex. N B A Finals => NBA Finals
const reducer = (total, currentValue, currentIndex, arr) => {
  if (
    currentValue.length === 1 &&
    !(currentIndex > 0 && arr[currentIndex - 1].length > 1)
  ) {
    return total + currentValue;
  } else {
    return total + " " + currentValue;
  }
};

const concatSingleChars = (title) => {
  const arrTitle = title.split(" ");
  return arrTitle.reduce(reducer);
};

const convertCase = (str) => {
  const s = toTitle(str);
  return concatSingleChars(s);
};

const tests = [
  "colName",
  "This_Is_A_title",
  "And_How_About_thisOne",
  "MaryHadALittleLamb",
  "employeeID",
  "N B A Finals",
  "N B A Finals in L A",
  "I Love L A"
];

const titles = tests.map((test) => {
  return convertCase(test);
});

console.log(titles);

這個正則表達式字符串是

.replace("/([a-zA-Z][a-z]*)/g",...);

暫無
暫無

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

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