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

City -> CITY
FirstName -> FIRST_NAME
DOB -> DOB
PATId -> PAT_ID
RoomNO -> ROOM_NO

以下几乎可以使用-只是在单词的开头添加了一个下划线:
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

最佳答案

从约翰·M·甘特(John M Gant)添加下划线然后大写的想法开始,我认为这个正则表达式应该起作用:

([A-Z])([A-Z][a-z])|([a-z0-9])([A-Z])

替换为:
$1$3_$2$4

您可以重命名捕获区域,以使替换字符串更易于阅读。只有$ 1或$ 3才有值,与$ 2和$ 4相同。一般想法是在以下情况下添加下划线:
  • 有两个大写字母,后跟一个小写字母,在两个大写字母之间放置下划线。 (PATId-> PAT_Id)
  • 有一个小写字母,后跟一个大写字母,将下划线放在两者的中间。 (RoomNO-> Room_NO and FirstName-> First_Name)

  • 希望这可以帮助。

    关于c# - 正则表达式:将驼峰式大小写转换为带有下划线的所有大写字母,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4511087/

    10-10 05:49