正则表达式 - PascalCase用下划线小写

时间:2014-01-06 14:03:56

标签: c# regex

我正在尝试使用C#将PascalCase属性名称(例如Is24HourIs512转换为带下划线的JSON样式小写(即is_24_houris_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"

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