可以使用什么正则表达式进行以下转换?
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美元.一般的想法是在以下情况下添加下划线:
希望这可以帮助.
Joh*_*ant 11
我建议一个简单的正则表达式插入下划线,然后string.ToUpper()转换为大写.
Regex.Replace(test, @"(\p{Ll})(\p{Lu})", "$1_$2").ToUpper()
Run Code Online (Sandbox Code Playgroud)
这是两个操作而不是一个,但对我来说,它比一个复杂的正则表达式替换更容易阅读.