C# 正则表达式-PascalCase到小写加下划线
我正在尝试使用C将PascalCase属性名称(如C# 正则表达式-PascalCase到小写加下划线,c#,regex,C#,Regex,我正在尝试使用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\u$2$4) 例如“Is24Hour”变为“Is24Hour”(其大小写为.ToLower())。 但是“Is512”变为“Is_51_2”用于小写 对于正则表达式,请执行
Is24Hour
,Is512
)转换为带下划线的JSON样式的小写字母(即is_24_hour
,is_512
)
到目前为止,我已经得到了很多,但它不适用于多个数字
([A-Z])([A-Z0-9][a-z])|([a-z0-9])([A-Z0-9])
使用替换表达式($1$3\u$2$4
)
例如“Is24Hour”
变为“Is24Hour”
(其大小写为.ToLower()
)。
但是“Is512”
变为“Is_51_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();
string stregex=@”((公认的解决方案对“23AHourDay12”等字符串不起作用,它产生“23 ahourday12”,但应“23小时/天””(见@vaindil注释)
下面是一个使用Linq而不是正则表达式的解决方案:
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 user。来源:谢谢,效果很好。很抱歉,我忘了在我的问题中添加替换表达式:)这根本无法正常工作。请参阅。即使使用提供的确切示例,也会导致无效的结果字符串。例如,使用此代码,23AHourDay12
将成为23 ahourday\u12
,但它应该是23 ahourday\u12
。仅供参考,这也称为snake case。
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();
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();
}
}