2011-08-19 79 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” 作为输出