Regex - PascalCase to lower case with underscores

c#, regex

Solution

Use String.ToLower for conversion into lowercase.

For the regex, the following seems to work:

((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+)

combined with the replacement expression:

_$1$2

Here's a full sample:

string strRegex = @"((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+)";
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline);
string strTargetString = @"Is24Hour" + "\n" + 
    @"Is512" + "\n" + @"A12Hour4" + "\n" + 
    @"23AHourDay12" + "\n" + @"An8DAY512";

string strReplace = @"_$1$2";

return myRegex.Replace(strTargetString, strReplace).ToLower();

Problem

I'm trying to convert PascalCase property names such as `Is24Hour`, `Is512` to JSON-style lowercase with underscores (ie. `is_24_hour`, `is_512`) using C#. So far I've got far but it doesn't work for multiple numbers. ``` ([A-Z])([A-Z0-9][a-z])|([a-z0-9])([A-Z0-9]) ``` With the replacement expression (`$1$3_$2$4`) For example `"Is24Hour"` becomes `"Is_24_Hour"` (which is then lower-cased by `.ToLower()`). but `"Is512"` becomes `"Is_51_2"`.

Original source