Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式-PascalCase到小写加下划线_C#_Regex - Fatal编程技术网

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”用于小写 对于正则表达式,请执行

我正在尝试使用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”

用于小写

对于正则表达式,请执行以下操作:

以下是完整的示例:

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();
    }
}