使用正则表达式来大写字符串的第一个和最后一个单词的首字母?

时间:2014-01-08 17:34:21

标签: c# .net regex

希望标题能说明一切,但是我希望大写这个字符串中第一个和最后一个单词的第一个字母,如下所示:

Turn this:
this is a regular sentence

Into this:
This is a regular Sentence

理想情况下,我希望它可以处理任何字符,例如à -> À,但如果这是一个更大的交易,我不希望过度复杂化。

1 个答案:

答案 0 :(得分: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);

但是,此方法确实假设最后一个单词前面有空格。