我正在尝试使用C#将PascalCase属性名称(例如Is24Hour
,Is512
转换为带下划线的JSON样式小写(即is_24_hour
,is_512
)。
到目前为止,我已经走得很远,但它不适用于多个数字。
([A-Z])([A-Z0-9][a-z])|([a-z0-9])([A-Z0-9])
使用替换表达式($1$3_$2$4
)
例如,"Is24Hour"
变为"Is_24_Hour"
(然后由.ToLower()
低位设置)。
但"Is512"
变为"Is_51_2"
。
答案 0 :(得分:8)
使用String.ToLower作为小写。
对于正则表达式,以下seems to work:
((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+)
结合替换表达式:
_$1$2
以下是完整的示例:
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();
答案 1 :(得分:1)
公认的解决方案对“23AHourDay12”这样的字符串不起作用,它产生“23_ahourday_12”,但应该“23_a_hour_day_12 ”(见@vaindil 评论)
这是使用 Linq 而不是 Regex 的解决方案:
public static class ExtensionMethods {
public static string ToUnderscoreCase(this string str) {
return string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())).ToLower();
}
}
感谢@vkobel github 用户。来源:https://gist.github.com/vkobel/d7302c0076c64c95ef4b