Regex to split camel case

JavascriptRegex

Javascript Problem Overview


I have a regular expression in JavaScript to split my camel case string at the upper-case letters using the following code (which I subsequently got from here):

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

Thus that returns:

"My Camel Case String"

Which is good. However, I want to step this up a notch. Could someone help me with a regex which will split if, and only if, the former character is lower-case and the latter is upper-case.

Thus, the above example will be the result I expect, but if I do:

"ExampleID"

Then I get returned:

"Example ID"

Instead of

"Example I D"

Since it's splitting at each upper-case and ignoring anything before it.

Hope that makes sense! And thanks :).

Javascript Solutions


Solution 1 - Javascript

My guess is replacing /([A-Z])/ with /([a-z])([A-Z])/ and ' $1' with '$1 $2'

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

/([a-z0-9])([A-Z])/ for numbers counting as lowercase characters

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

Solution 2 - Javascript

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

outputs:

"My Camel Case String"

Solution 3 - Javascript

If you want an array of lower case words:

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

If you want a string of lower case words:

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

If you want to separate the words but keep the casing:

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

Solution 4 - Javascript

Sometime camelCase strings include abbreviations, for example:

PDFSplitAndMergeSamples
PDFExtractorSDKSamples
PDFRendererSDKSamples
BarcodeReaderSDKSamples

And in this case the following function will work, it splits the string leaving abbreviations as separate strings:

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

Example:

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

console.log(SplitCamelCaseWithAbbreviations('PDFSplitAndMergeSamples'));
console.log(SplitCamelCaseWithAbbreviations('PDFExtractorSDKSamples'));
console.log(SplitCamelCaseWithAbbreviations('PDFRendererSDKSamples'));
console.log(SplitCamelCaseWithAbbreviations('BarcodeReaderSDKSamples'));

Solution 5 - Javascript

I found that none of the answers for this question really worked in all cases and also not at all for unicode strings, so here's one that does everything, including dash and underscore notation splitting.

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

If you don't want numbers treated as lower case letters, then:

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

Solution 6 - Javascript

Regex not-a word boundary \B character can also be used

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

Solution 7 - Javascript

Hi I saw no live demo , thanks @michiel-dral

var tests =[ "camelCase",
             "simple",
             "number1Case2",
             "CamelCaseXYZ",
             "CamelCaseXYZa" 
           ]

function getCamelCaseArray(camel) {
  var reg = /([a-z0-9])([A-Z])/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>

Solution 8 - Javascript

If you want to capitalize and add space between numbers as well, this works.

transform(value: string, ...args: any[]): string {
    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
}

Results:

This 1 Is A Sample Text    

Solution 9 - Javascript

If you're like me and had a camelCase value such as:

thisIsMyCamelCaseValue where the first letter is lowercased

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

Solution 10 - Javascript

I prefer to work with arrays over strings. It's easier to debug and more flexible. This is an actual join instead of replace. I haven't dealt with white spaces in the strings but you could just trim each element easily enough.

const splitCamelCase = str => str.match(/^[A-Z]?[^A-Z]*|[A-Z][^A-Z]*/g).join(' ');

console.log(splitCamelCase('fooMyCamelCaseString'));
console.log(splitCamelCase('MyCamelCaseString'));
console.log(splitCamelCase('XYZMyCamelCaseString'));
console.log(splitCamelCase('alllowercase'));

Solution 11 - Javascript

You can use a combination of regEx, replace, and trim.

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

// ABC My Camel Case STR

Solution 12 - Javascript

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

is the simplest way I've found, for simple camel/titlecase splitting.

Solution 13 - Javascript

I recently came across this question and needed to do the exact same thing:

employeeID should be rendered as Employee ID

I found this convert case library from zellwk plus a little additional reduce function did the trick for me:

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

Solution 14 - Javascript

This RegExp String is

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionkeldarView Question on Stackoverflow
Solution 1 - JavascriptMichiel DralView Answer on Stackoverflow
Solution 2 - JavascriptAdrian SalazarView Answer on Stackoverflow
Solution 3 - JavascriptbrielovView Answer on Stackoverflow
Solution 4 - JavascriptEugeneView Answer on Stackoverflow
Solution 5 - JavascriptRichtopiaView Answer on Stackoverflow
Solution 6 - JavascriptalzedView Answer on Stackoverflow
Solution 7 - JavascriptBenito GómezView Answer on Stackoverflow
Solution 8 - JavascriptKegan VanSickleView Answer on Stackoverflow
Solution 9 - JavascriptLuke GarriganView Answer on Stackoverflow
Solution 10 - JavascriptRimianView Answer on Stackoverflow
Solution 11 - JavascriptBehnam AzimiView Answer on Stackoverflow
Solution 12 - JavascriptmattView Answer on Stackoverflow
Solution 13 - JavascriptJordanView Answer on Stackoverflow
Solution 14 - JavascriptJohnView Answer on Stackoverflow