在Regex中,如何在以Capital开头的每个单词之间添加一个额外的空格

时间:2013-04-16 08:14:09

标签: c# regex

我有一个字符串:CategoryName

我需要在CategoryName之间添加空格。

所以我必须在每个大写字母前插入一个空格。

3 个答案:

答案 0 :(得分:5)

此代码将完成工作

var source = "CategoryName";
var nameConvert = new Regex(@"((?<=[a-z])[A-Z]|(?<!^|\s)[A-Z][a-z])");
var converted = nameConvert.Replace(source, " $1");

这将留下多个大写字母,例如FearTheCIAReally变为Fear The CIA Really

解释正则表达式:

  • (启动捕获组$ 1
  • (?<=[a-z])[A-Z]大写字母前面有一个小写字母(不要捕获小写字母)
  • |
  • (?<!^|\s)前面的字符不是空格或字符串的开头,但不捕获
  • [A-Z]大写字母
  • [a-z]后跟小写字母
  • )结束捕获组1

我实际上将此作为我一直使用的库函数

public static class StringExtensions {

   private static readonly Regex NameConvert =
                new Regex(@"((?<=[a-z])[A-Z]|(?<!^|\s)[A-Z][a-z])");

   public static string ToDisplayFormat(this string name) {
     return string.IsNullOrEmpty(name) ? 
       String.Empty :
       NameConvert.Replace(name," $1");
   }
}

然后我可以在代码中使用它

var name="CategoryName";
var displayName = name.ToDisplayFormat();

答案 1 :(得分:5)

var input = "CategoryName";
var result = Regex.Replace(input, "([a-z])([A-Z])", @"$1 $2"); //Category Name

更新(这会将大写字母序列视为一个单词)

var input = "SimpleHTTPRequest";
var result = Regex.Replace(input, "([a-z]|[A-Z]{2,})([A-Z])", @"$1 $2");
//Simple HTTP Request

答案 2 :(得分:0)

([A-Z?])[_ ]?([a-z])

试试这个正则表达式。

希望它有所帮助。