2014-01-06 32 views
8

我想PascalCase屬性名稱,例如Is24HourIs512轉換成JSON風格小寫使用C#下劃線(即is_24_houris_512)。正則表達式 - PascalCase爲小寫用下劃線

到目前爲止,我已經遠遠的,但它不適用於多個數字。

([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

僅供參考,這也被稱爲蛇案件。 https://en.m.wikipedia.org/wiki/Snake_case – Julian

回答

8

對於小寫字母使用String.ToLower

對於正則表達式,下列seems to work

((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+) 

與替換表達式組合:

這裏的一個完整的示例:

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

謝謝,完美的作品。對不起,我忘了將替換表達式添加到我的問題:) – Jamie