2010-08-02 64 views
14

我需要一个函数,将采取一个字符串和“帕斯卡情况”它。一个新词开始的唯一指标是下划线。下面是需要一些例如字符串进行清理:功能使帕斯卡案件? (C#)

  1. price_old =>应PriceOld
  2. rank_old =>应RankOld

我开始上的功能,使第一个字符工作大写:

public string FirstCharacterUpper(string value) 
{ 
if (value == null || value.Length == 0) 
    return string.Empty; 
if (value.Length == 1) 
    return value.ToUpper(); 
var firstChar = value.Substring(0, 1).ToUpper(); 
return firstChar + value.Substring(1, value.Length - 1); 
} 

上述功能不会做的事情是删除下划线和“ToUpper的”字符为下划线的权利。

此外,任何想法如何帕斯卡案例字符串没有任何指标(如下划线)。例如:

  1. companysource
  2. financialtrend
  3. accountingchangetype

这里的主要挑战是确定其中一个字结束和另一个开始。我想我需要某种查找字典来确定新单词的起始位置?我们有图书馆来做这种事吗?

感谢,

保罗

+4

一个快速评论 - 这是Pascal大小写。骆驼案例以小写开头,例如'rankOld'。 – 2010-08-02 09:50:39

+1

@Jon O,很高兴知道......更新... – 2010-08-02 09:52:28

+1

另一个快速评论 - 当你想从一个特定的起点开始整个子串时,没有必要指定一个长度。所以,而不是value.Substring(1,value.Length - 1),你可以简单地做value.Substring(1)。 – Anton 2010-08-02 09:54:03

回答

23

您可以使用TextInfo.ToTitleCase方法,然后删除'_'字符。

因此,使用扩展方法我有:

http://theburningmonk.com/2010/08/dotnet-tips-string-totitlecase-extension-methods

你可以做somethingl IKE在此:

var s = "price_old"; 
s.ToTitleCase().Replace("_", string.Empty); 
+0

有趣的方法! – 2010-08-02 09:58:21

+0

@theburningmonk我喜欢我目前看到的......可能最终会使用这种方法。 – 2010-08-02 10:06:49

+0

@theburningmonk它就像一个魅力!再次感谢。 – 2010-08-02 10:25:20

11

那么第一件事情很简单:

string.Join("", "price_old".Split(new [] { '_' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Substring(0, 1).ToUpper() + s.Substring(1)).ToArray()); 

回报PriceOld

第二件事是方式更加困难。由于companysource可能是CompanySource或者可能是CompanysOurce,可以是自动的,但是相当有缺陷。你需要一个English dictionary,并做一些猜测(嗯,我的意思是很多)在单词的组合是正确的。

+0

正如你如此有效地指出,处理单词很难。我想这是无法解决的,我不得不做一些字典查找。我想我希望有人已经开发了一些我可以使用的东西。 – 2010-08-02 10:00:37

+0

+1:用于指出字典解决方案*第二件事* – 2010-08-02 10:46:56

4

试试这个:

public static string GetPascalCase(string name) 
{ 
    return Regex.Replace(name, @"^\w|_\w", 
     (match) => match.Value.Replace("_", "").ToUpper()); 
} 

Console.WriteLine(GetPascalCase("price_old")); // => Should be PriceOld 
Console.WriteLine(GetPascalCase("rank_old")); // => Should be RankOld 
+0

这只是分裂和子串处理的四倍,编译正则表达式时要慢两倍(这样做100.000次)。 – 2010-08-02 09:58:04

+2

我可以有你的基准吗,@Jan? – 2010-08-02 09:59:40

1

用下划线:

s = Regex.Replace(s, @"(?:^|_)([a-z])", 
     m => m.Groups[1].Value.ToUpper()); 

无下划线:

你对你自己的存在。但是继续寻找;我会很惊讶,如果没有人之前做过。

0

对于第二个拼接单词拆分问题,您可以利用我们最好的朋友Google & Co.如果您的拼接输入是由通常的英文单词组成,那么搜索引擎对单个单词有很好的命中率搜索查询

如果你输入你的样品输入,谷歌和Bing建议如下:

original    | Google    | Bing 
===================================================================== 
companysource  | company source  | company source 
financialtrend  | financial trend  | financial trend 
accountingchangetype | accounting changetype | accounting change type 

this exaple

写一个小屏幕刮板应该相当容易。

+0

http://stackoverflow.com/questions/3856630/how-to-separate-words-in-a-sentence-with-spaces - 8行为一个shell脚本。 – 2010-12-07 02:38:20

0

对于那些谁需要一个非正则表达式的解决方案

public static string RemoveAllSpaceAndConcertToPascalCase(string status) 
     { 
      var textInfo = new System.Globalization.CultureInfo("en-US").TextInfo; 
      var titleCaseStr = textInfo.ToTitleCase(status); 
      string result = titleCaseStr.Replace("_","").Replace(" ", ""); 

      return result; 
     }