2010-08-02 34 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; 
     }