正则表达式:将驼峰案例转换为带下划线的所有大写字母

MCS*_*MCS 12 c# regex

可以使用什么正则表达式进行以下转换?

City -> CITY
FirstName -> FIRST_NAME
DOB -> DOB
PATId -> PAT_ID
RoomNO -> ROOM_NO
Run Code Online (Sandbox Code Playgroud)

以下几乎可以工作 - 它只是在单词的开头添加了一个额外的下划线:

var rgx = @"(?x)( [A-Z][a-z,0-9]+ | [A-Z]+(?![a-z]) )";

var tests = new string[] { "City",
                           "FirstName",
                           "DOB",
                           "PATId",
                           "RoomNO"};

foreach (var test in tests)
    Console.WriteLine("{0} -> {1}", test, 
                       Regex.Replace(test, rgx, "_$0").ToUpper());


// output:
// City -> _CITY
// FirstName -> _FIRST_NAME
// DOB -> _DOB
// PATId -> _PAT_ID
// RoomNO -> _ROOM_NO
Run Code Online (Sandbox Code Playgroud)

Joh*_*ald 16

从John M Gant的想法中添加下划线然后大写,我认为这个正则表达式应该有效:

([A-Z])([A-Z][a-z])|([a-z0-9])([A-Z])
Run Code Online (Sandbox Code Playgroud)

替换为:

$1$3_$2$4
Run Code Online (Sandbox Code Playgroud)

您可以重命名捕获区域以使替换字符串更好一些.只有$ 1或$ 3应该有一个值,相同的是2美元和4美元.一般的想法是在以下情况下添加下划线:

  • 有两个大写字母后跟一个小写字母,将下划线放在两个大写字母之间.(PATId - > PAT_Id)
  • 有一个小写字母后跟一个大写字母,下划线放在两个中间.(RoomNO - > Room_NO和FirstName - > First_Name)

希望这可以帮助.


Joh*_*ant 11

我建议一个简单的正则表达式插入下划线,然后string.ToUpper()转换为大写.

Regex.Replace(test, @"(\p{Ll})(\p{Lu})", "$1_$2").ToUpper()
Run Code Online (Sandbox Code Playgroud)

这是两个操作而不是一个,但对我来说,它比一个复杂的正则表达式替换更容易阅读.