按大写字母分割字符串

78

分割建议您想要一个字符串数组,但看起来您更想在字符串中插入空格? - Guffa
5个回答

104

使用这个正则表达式(我忘记从哪个stackoverflow答案上获取的,现在会搜索一下):

 public static string ToLowercaseNamingConvention(this string s, bool toLowercase)
        {
            if (toLowercase)
            {
                var r = new Regex(@"
                (?<=[A-Z])(?=[A-Z][a-z]) |
                 (?<=[^A-Z])(?=[A-Z]) |
                 (?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace);

                return r.Replace(s, "_").ToLower();
            }
            else
                return s;
        }

我在这个项目中使用它:http://www.ienablemuch.com/2010/12/intelligent-brownfield-mapping-system.html

[编辑]

我现在找到了:如何将Java中的CamelCase转换为人类可读名称?

很好地分割了“TodayILiveInTheUSAWithSimon”,“ Today”前面没有空格:

using System;
using System.Text.RegularExpressions;

namespace TestSplit
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Console.WriteLine ("Hello World!");



            var r = new Regex(@"
                (?<=[A-Z])(?=[A-Z][a-z]) |
                 (?<=[^A-Z])(?=[A-Z]) |
                 (?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace);


            string s = "TodayILiveInTheUSAWithSimon";
            Console.WriteLine( "YYY{0}ZZZ", r.Replace(s, " "));
        }
    }
}

输出:

 YYYToday I Live In The USA With SimonZZZ

非常感谢!你能解释一下正则表达式的不同部分吗? - Nir

90

14
如果您不想拆分大写缩略词,请使用return string.Join(" ", Regex.Split(value, @"(?<!^)(?=[A-Z](?![A-Z]|$))"));这段代码。 - śmiglidigli
1
虽然这是一个老线程,但我发现它很有用。这是我从这个答案中改编的扩展方法:public static string SplitCamelCase(this string input, string delimeter = " ") { return input.Any(char.IsUpper) ? string.Join(delimeter, Regex.Split(input, "(?<!^)(?=[A-Z])")) : input; }。这允许您指定分隔符,并且如果输入字符串不包含任何大写字母,则返回输入字符串而不执行RegEx。示例用法:var s = myString.SplitCamelCase();var s = myString.SplitCamelCase(" ,"); - Anders
这将分割 CamelCasepascalCase - Themelis

40

您只需循环遍历字符,并在需要时添加空格:

string theString = "SeveralWordsString";

StringBuilder builder = new StringBuilder();
foreach (char c in theString) {
  if (Char.IsUpper(c) && builder.Length > 0) builder.Append(' ');
  builder.Append(c);
}
theString = builder.ToString();

6
    public static IEnumerable<string> SplitOnCapitals(string text)
    {
        Regex regex = new Regex(@"\p{Lu}\p{Ll}*");
        foreach (Match match in regex.Matches(text))
        {
            yield return match.Value;    
        }
    }

这将正确处理 Unicode。


4
            string str1 = "SeveralWordsString";
            string newstring = "";
            for (int i = 0; i < str1.Length; i++)
            {
                if (char.IsUpper(str1[i]))
                    newstring += " ";                    
                newstring += str1[i].ToString();
            }

4
你应该使用 StringBuilder 而不是创建大量的字符串。 - Andrew
他也可以将结果附加到字符数组中,并将数组转换为字符串。 - John Lord

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接