2014-01-08 40 views
0

希望的標題說明了一切,但我想大寫第一個和在這樣的字符串中的最後一句話的第一個字母:使用正則表達式來大寫字符串的第一個和最後一個單詞的第一個字母?

Turn this: 
this is a regular sentence 

Into this: 
This is a regular Sentence 

理想情況下,我想它去努力任何字符,如à -> À,但我不希望過分複雜化,如果這是一個更大的交易來拉動。

+2

任何嘗試呢? – Jerry

+2

當提問的用戶表示他們至少嘗試瞭解決方案時,我們在StackOverflow中喜歡它。 – crush

+0

夠公平的。不幸的是,我唯一的嘗試就是我試圖簡單地把第一個字大寫。當我決定在這裏提出這個問題時,我正要放棄並在.NET中使用字符串庫函數。 – RandyWhirl

回答

6

正則表達式本身不能做到這一點,但是您可以將自定義MatchEvaluator傳遞給Replace方法。這可以是一個lambda表達式,如:

var input = "this is a regular sentence"; 
var output = Regex.Replace(
     input, 
     @"^(?<cap>\w)(?<rest>\w*)|(?<cap>\w)(?<rest>\w*)$", 
     m => m.Groups["cap"].Value.ToUpper() + m.Groups["rest"]); 

Console.WriteLine(output); // This is a regular Sentence 

注意,在模式,我用命名組,這樣我就不用擔心我是否格式化第一還是硬道理。

或者更簡單地

var output = Regex.Replace(
     input, 
     @"^(?<cap>\w)|\b(?<cap>\w)(?=\w*$)", 
     m => m.Groups["cap"].Value.ToUpper()); 

在這裏,我需要使用一個預測先行斷言,以確定最後一個字,但除此之外,這個想法是一樣的。


如果性能是一個大問題,你總是可以做到這一點:

int c = input.LastIndexOf(' '); 
var output = 
    char.ToUpper(input[0]) + 
    input.Substring(1, c) + 
    char.ToUpper(input[c + 1]) + 
    input.Substring(c + 2); 

然而,這種方法並假設最後一個字前面有一個空格。

+0

這是完美的。從技術上講,我認爲所有的單詞都是正確的,但它只是輸出第一個和最後一個單詞?我問,因爲我在原始文章中給出了一個簡單的例子,並將其稱爲「句子」,但它可能是一個很長的字符串。所以我想和你一起檢查一下你覺得性能會在一個很大的循環中循環,比如1000個字符串,每個字符串包含100個字。 – RandyWhirl

+0

我無法想象這會贏得與@ tenub的解決方案的戰鬥,他在上面評論他提到的。 – crush

+0

@RandyWhirl不,它只是修改第一個和最後一個單詞。 –

相關問題