2014-01-11 75 views
0

我可以使用正則表達式掙扎的正則表達式的代碼:首字母大寫camel_case

但是我的解決方案並沒有與MyOtherTClassName工作,應該轉化爲my_other_t_class_name字符串MyClassName轉化爲my_class_name

此外,這並沒有對ClassNumber1工作,要麼,應轉化爲class_number_1

沒有進入我的解決方案,這還不夠好,我想與變換的正則表達式的代碼幫助:

  1. MyClassName - >my_class_name
  2. MyOtherTClassName - >my_other_t_class_name
  3. MyClassWith1Number - >my_class_with_1_number

感謝,

蓋伊

+1

您的示例不一致(爲什麼'CLass'被當作'Class'?),並且您需要顯示您的「不夠好」的嘗試。 –

+0

@NielsKeurentjes我認爲MyOtherTCLassName是爲了MyOtherTClassName,人是正確的? –

+0

我認爲,直到我看到了兩次相同的'錯誤'。 –

回答

3

背後的邏輯是,你想每一個大寫字母轉換爲其小寫變體,並用下劃線preceed它(每個數字)。
例如,一個T變成_t,6變成_6
唯一的例外是第一個字符。你不想在低於它的前面。正則表達式將使用negative lookbehind來處理這種情況,以便與第一個字符不匹配。

//using System.Text.RegularExpression 

//your input 
string input = "MyOtherTClass1Name"; 

//the regex 
string result = Regex.Replace(
    input, 
    "((?<!^)[A-Z0-9])", //the regex, see below for explanation 
    delegate(Match m) { return "_" + m.ToString().ToLower(); }, //replace function 
    RegexOptions.None 
); 
result = result.ToLower(); //one more time ToLower(); for the first character of the input 

Console.WriteLine(result); 

對於正則表達式本身:

(   #start of capturing group 
    (?<!  #negative lookbehind 
    ^ #beginning of the string 
)   #end of lookbehind 
    [A-Z0-9] #one of A-Z or 0-9 
)   #end of capturing group 

所以我們捕捉每一個大寫字母,每個數字(除了第一個字符),並用自己的小寫變型與組合替換它們先於下劃線。

+0

如果存在多個大寫字母序列(如HTML?),那麼該怎麼辦?您還可以添加負向預覽 – BlackBear

+0

由於OP希望每次發生(即)'A'都被替換爲_a'。所以如果有多個大寫字母,每個都會被替換。 –

0

我最近有這個問題,如果只有一個數字,而前面的答案有效,但如果有兩個或更多的連續數字,他們每個都會在它們之前有一個下劃線。我用這個在PHP中爲我轉換它。

strtolower(preg_replace('/(?<!^)([A-Z])|(?<![0-9])([0-9])/', '_$1$2', $string)) 

我相信,正則表達式應該和C#一樣,所以我會打破這種情況。

(?<!  # negative look behind 
^  # beginning of string 
) 
([A-Z]) # one of capital letters 
|   # or 
(?<!  # negative look behind 
    [0-9] # one of digits 
) 
([0-9]) # one of digits 

這個想法對於字母來說是一樣的。確保它不是字符串的開頭。對於數字,只要確保前一個字符不是一個數字。我們不必擔心它是字符串的開始,因爲字符串不會以數字開頭。

相關問題