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

Jam*_*mie 8 c# regex

我想转换PascalCase属性名称,例如Is24Hour,Is512以JSON风格的小写用下划线(即is_24_hour,is_512使用C#).

到目前为止,我已经走远了,但它不适用于多个数字.

([A-Z])([A-Z0-9][a-z])|([a-z0-9])([A-Z0-9])
Run Code Online (Sandbox Code Playgroud)

用替换表达式($1$3_$2$4)

例如"Is24Hour"变成"Is_24_Hour"(然后是低位的.ToLower()).但"Is512"变成了"Is_51_2".

Ale*_*ici 8

String.ToLower用于小写.

对于正则表达式,以下似乎有效:

((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+)
Run Code Online (Sandbox Code Playgroud)

结合替换表达式:

_$1$2
Run Code Online (Sandbox Code Playgroud)

这是一个完整的示例:

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();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这完美地运作.对不起,我忘了在我的问题中添加替换表达式:) (2认同)
  • 这根本无法正常工作。请参阅[这个小提琴](https://dotnetfiddle.net/JOS1Jm)。即使使用提供的确切示例也会导致无效的结果字符串。例如,使用此代码,“23AHourDay12”将变为“23_ahourday_12”,但它应该是“23_a_hour_day_12”。 (2认同)