Подтвердить что ты не робот

Разделить строку заглавными буквами

Возможный дубликат:
Регулярное выражение, разделите строку заглавной буквой, но игнорируйте TLA

У меня есть строка, которая представляет собой комбинацию из нескольких слов, каждое слово заглавное.
Например: НесколькоWordsString

Используя С#, как я могу разделить строку на строку "Несколько слов"?

Спасибо!

4b9b3361

Ответ 1

Используйте это регулярное выражение (я забыл, с какого ответа на 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

[EDIT]

Я нашел его сейчас: Как преобразовать CamelCase в читаемые человеком имена на Java?

Приятно расколоть "TodayLiveInTheUSAWithSimon", нет места перед "Сегодня":

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

Ответ 3

Вы можете просто прокрутить символы и добавить необходимые места:

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();

Ответ 4

    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;    
        }
    }

Это правильно обработает Юникод.

Ответ 5

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