2011-08-19 76 views
3

我試圖使用正則表達式來將像這樣的「朝鮮」 這樣的字符串轉換爲像「northKorea」這樣的字符串 - 是否有人知道我該如何在c#中完成此操作?c中的正則表達式camelcase#

乾杯

+3

爲什麼正則表達式?爲什麼不用空字符串替換所有空格並且用小寫字母替換第一個字符? – Bazzz

回答

3

您可以將其拆分並重新放回原處:

string[] split = ("North Korea").Split(' '); 

StringBuilder sb = new StringBuilder(); 

for (int i = 0; i < split.Count(); i++) 
{ 
    if (i == 0) 
     sb.Append(split[i].ToLower()); 
    else 
     sb.Append(split[i]); 
} 

編輯:切換到一個StringBuilder,而不是像Bazzz建議。

+0

+1我喜歡這種方法,但字符串連接並不是性能和內存管理的好主意。也許你應該用一個StringBuilder添加同樣的例子。 – Bazzz

+0

我同意@Bazzz每次Split/Concat使用獨角獸死亡。 –

+2

對不起每個人都殺了幾個獨角獸:( –

4

忘記正則表達式。
所有你需要的是一個駝峯轉換算法:

在這裏看到: http://www.codekeep.net/snippets/096fea45-b426-40fd-8beb-dec49d8a8662.aspx

使用這一個:

string camelCase = ConvertCaseString(a, Case.CamelCase); 

複製粘貼的情況下,它會脫機:

void Main() { 
    string a = "background color-red.brown"; 
    string camelCase = ConvertCaseString(a, Case.CamelCase); 
    string pascalCase = ConvertCaseString(a, Case.PascalCase); 
} 

/// <summary> 
/// Converts the phrase to specified convention. 
/// </summary> 
/// <param name="phrase"></param> 
/// <param name="cases">The cases.</param> 
/// <returns>string</returns> 
static string ConvertCaseString(string phrase, Case cases) 
{ 
    string[] splittedPhrase = phrase.Split(' ', '-', '.'); 
    var sb = new StringBuilder(); 

    if (cases == Case.CamelCase) 
    { 
     sb.Append(splittedPhrase[0].ToLower()); 
     splittedPhrase[0] = string.Empty; 
    } 
    else if (cases == Case.PascalCase) 
     sb = new StringBuilder(); 

    foreach (String s in splittedPhrase) 
    { 
     char[] splittedPhraseChars = s.ToCharArray(); 
     if (splittedPhraseChars.Length > 0) 
     { 
      splittedPhraseChars[0] = ((new String(splittedPhraseChars[0], 1)).ToUpper().ToCharArray())[0]; 
     } 
     sb.Append(new String(splittedPhraseChars)); 
    } 
    return sb.ToString(); 
} 

enum Case 
{ 
    PascalCase, 
    CamelCase 
} 
+1

+1好方法,但它有點像用大炮射擊蚊子。儘管如此,即使只是讓OP重新考慮他/她的正則表達式的想法,它仍然是很好的和相關的信息。 :) – Bazzz

6

,如果你知道你的所有輸入字符串都在標題的情況下(如「朝鮮」),你可以簡單地做:

string input = "North Korea"; 
input = input.Replace(" ",""); //remove spaces 
string output = char.ToLower(input[0]) + 
       input.Substring(1); //make first char lowercase 
            // output = "northKorea" 

如果你的一些投入是不是在標題情況下,你可以使用TextInfo.ToTitleCase

string input = "NoRtH kORea"; 
input = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(input); 
input = input.Replace(" ",""); //remove spaces 
string output = char.ToLower(input[0]) + 
      input.Substring(1); //make first char lowercase 
           // output = "northKorea" 
1

String::Split絕對是我的寵物小偷之一。此外,沒有其他的答案處理:

  • 文化
  • 所有形式的文字分隔符的
  • 當它與文字分隔符開始會發生什麼

我試圖讓它儘可能接近基類庫代碼中的內容:

static string ToCamelCaseInvariant(string value) { return ToCamelCase(value, true, CultureInfo.InvariantCulture); } 
static string ToCamelCaseInvariant(string value, bool changeWordCaps) { return ToCamelCase(value, changeWordCaps, CultureInfo.InvariantCulture); } 

static string ToCamelCase(string value) { return ToCamelCase(value, true, CultureInfo.CurrentCulture); } 
static string ToCamelCase(string value, bool changeWordCaps) { return ToCamelCase(value, changeWordCaps, CultureInfo.CurrentCulture); } 

/// <summary> 
/// Converts the given string value into camelCase. 
/// </summary> 
/// <param name="value">The value.</param> 
/// <param name="changeWordCaps">If set to <c>true</c> letters in a word (apart from the first) will be lowercased.</param> 
/// <param name="culture">The culture to use to change the case of the characters.</param> 
/// <returns> 
/// The camel case value. 
/// </returns> 
static string ToCamelCase(string value, bool changeWordCaps, CultureInfo culture) 
{ 
    if (culture == null) 
     throw new ArgumentNullException("culture"); 
    if (string.IsNullOrEmpty(value)) 
     return value; 

    var result = new StringBuilder(value.Length); 
    var lastWasBreak = true; 
    for (var i = 0; i < value.Length; i++) 
    { 
     var c = value[i]; 
     if (char.IsWhiteSpace(c) || char.IsPunctuation(c) || char.IsSeparator(c)) 
     { 
      lastWasBreak = true; 
     } 
     else if (char.IsNumber(c)) 
     { 
      result.Append(c); 
      lastWasBreak = true; 
     } 
     else 
     { 
      if (result.Length == 0) 
      { 
       result.Append(char.ToLower(c, culture)); 
      } 
      else if (lastWasBreak) 
      { 
       result.Append(char.ToUpper(c, culture)); 
      } 
      else if (changeWordCaps) 
      { 
       result.Append(char.ToLower(c, culture)); 
      } 
      else 
      { 
       result.Append(c); 
      } 

      lastWasBreak = false; 
     } 
    } 

    return result.ToString(); 
} 

// Tests 
' This is a test. 12345hello world' = 'thisIsATest12345HelloWorld' 
'--north korea' = 'northKorea' 
'!nOrTH koreA' = 'northKorea' 
'System.Console.' = 'systemConsole' 
0
string toCamelCase(string s) 
    { 
     if (s.Length < 2) return s.ToLower(); 
     return Char.ToLowerInvariant(s[0]) + s.Substring(1); 
    } 

與Paolo Falabella的代碼類似,但仍然存在空字符串和1個字符串。

2

這建立在Paolo Falabella的答案上作爲字符串擴展並處理一些邊界情況,如空字符串。由於CamelCase和camelCase之間存在一些混淆,我將其稱爲Wikipedia上描述的LowerCamelCase。我抵制了與nerdCaps合作的誘惑。

internal static string ToLowerCamelCase(this string input) 
{ 
    string output = "";    
    if(String.IsNullOrEmpty(input) == false ) 
    { 
     output = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(input); //in case not Title Case 
     output = output.Replace(" ", ""); //remove any white spaces between words 
     if(String.IsNullOrEmpty(output) == false) //handles the case where input is " " 
     { 
      output = char.ToLower(output[0]) + output.Substring(1); //lowercase first (even if 1 character string) 
     } 
    } 
    return output; 
} 

用途:

string test = "Foo Bar"; 
test = test.ToLowerCamelCase(); 
... //test is now "fooBar" 

更新: 統提出的意見好點 - 這不會對字形工作。查看toong提供的鏈接。如果你想調整上述的字形代碼,還有迭代字形herehere的例子。

+1

我喜歡你的方法,一個很小的問題(這裏是我猜的所有答案):如果第一個字母是由組合字符(「a \ u0304 \ u0308「=」ā̈「)或代理對(」\ uD950 \ uDF21「=」 「)?您可能想要使用StringInfo.GetNextTextElement - 請參閱:http://msdn.microsoft.com/en-us /library/y0hcb622.aspx – toong

+0

@toong - 這是一個很好的觀點。我已更新引用您的評論並添加了一些鏈接。 – acarlon

1

嘗試以下操作:

var input = "Hi my name is Rony"; 
var subStrs = input.ToLower().Split(' '); 
var output = ""; 

foreach(var s in subStrs) 
{ 
    if(s!=subStrs[0]) 
     output += s.First().ToString().ToUpper() + String.Join("", s.Skip(1)); 
    else 
     output += s; 
} 

應該得到 「hiMyNameIsRony」 作爲輸出