2014-09-21 74 views
0

所以我有一個任務,當我輸入「a aa」時,它應該有「A aA A」的輸出,但是我的輸出產生了「aa aA」而不是C# - 如何在段落上首字母大寫首字母? (結合正則表達式)

這個代碼該處理邏輯

private void mnuSentenize_Click(object sender, EventArgs e) 
    { 
     if (ActiveMdiChild != null) 
     { 
      frmNotepad SNTZ = (frmNotepad)ActiveMdiChild; 
      string Input = ((frmNotepad)ActiveMdiChild).FileContent.ToString(); 
      var Result = (char.ToUpper(Input[0]) + (Regex.Replace(Input, @"([.]\b[a-z]|[.] \b[a-z]|[?]\b[a-z]|[?] \b[a-z]|[!]\b[a-z]|[!] \b[a-z])", X => X.Value.ToUpper()))); 
      SNTZ.FileContent = Result.ToString(); 
     } 
    } 

我用正則表達式來處理的替代品,但至今未能找到一個方法來大寫第一個字符,它從哪兒

+0

但在一個字的最後一個字母在你期望的輸出是大寫的。 – 2014-09-21 18:01:15

回答

0

這裏做額外的炭蹦出是找到一個正則表達式每句話中第一個小寫字母:

(?<=(?:^|\.)\s*)\p{Ll} 

\p{Ll}將匹配任何小寫字母,並且lookbehind將確保它是字符串的第一個字母或句點後的第一個字母,忽略空格。

下面是如何使用它:

var str = "a a.a. a"; 
var result = Regex.Replace(str, @"(?<=(?:^|\.)\s*)\p{Ll}", m => m.Value.ToUpper()); 

Online demo


至於你的原代碼,你的錯誤是你連接具有整體的正則表達式替換結果大寫首字母字符串。改爲嘗試Regex.Replace(Input.Substring(1), ...。你還應該檢查字符串是否至少有一個字符長。

+0

或者,沒有後視(這通常是昂貴的),((?:^ | \。)\ s *)(\ p {Ll})'。替換代碼必須稍作更改。 – nhahtdh 2014-09-22 05:39:35

0

非常感謝,它的工作

固定碼:

private void mnuSentenize_Click(object sender, EventArgs e) 
    { 
     if (ActiveMdiChild != null) 
     { 
      frmNotepad SNTZ = (frmNotepad)ActiveMdiChild; 
      string Input = ((frmNotepad)ActiveMdiChild).FileContent.ToString(); 
      var Result = Regex.Replace(Input, @"((?<=(?:^|\.)\s*)\p{Ll}|[.]\b[a-z]|[.] \b[a-z]|[?]\b[a-z]|[?] \b[a-z]|[!]\b[a-z]|[!] \b[a-z])", X => X.Value.ToUpper()); 
      SNTZ.FileContent = Result.ToString(); 
     } 
    }