Лучший способ конвертировать Pascal Case в предложение - PullRequest
65 голосов
/ 27 ноября 2008

Как лучше всего преобразовать регистр Паскаля (верхний регистр верблюда) в предложение.

Например, начиная с

"AwaitingFeedback"

и преобразование этого в

"Awaiting feedback"

C # предпочтительно, но я могу преобразовать его из Java или аналогичного.

Ответы [ 15 ]

64 голосов
/ 31 июля 2009
public static string ToSentenceCase(this string str)
{
    return Regex.Replace(str, "[a-z][A-Z]", m => m.Value[0] + " " + char.ToLower(m.Value[1]));
}

В версиях Visual Studio после 2015 года вы можете сделать

public static string ToSentenceCase(this string str)
{
    return Regex.Replace(str, "[a-z][A-Z]", m => $"{m.Value[0]} {char.ToLower(m.Value[1])}");
}

На основе: Преобразование регистра Паскаля в предложения с использованием регулярного выражения

15 голосов
/ 28 мая 2010

Это работает для меня:

Regex.Replace(strIn, "([A-Z]{1,2}|[0-9]+)", " $1").TrimStart()
15 голосов
/ 27 ноября 2008

Вот, пожалуйста ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CamelCaseToString
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(CamelCaseToString("ThisIsYourMasterCallingYou"));   
        }

        private static string CamelCaseToString(string str)
        {
            if (str == null || str.Length == 0)
                return null;

            StringBuilder retVal = new StringBuilder(32);

            retVal.Append(char.ToUpper(str[0]));
            for (int i = 1; i < str.Length; i++ )
            {
                if (char.IsLower(str[i]))
                {
                    retVal.Append(str[i]);
                }
                else
                {
                    retVal.Append(" ");
                    retVal.Append(char.ToLower(str[i]));
                }
            }

            return retVal.ToString();
        }
    }
}
9 голосов
/ 28 мая 2016

Я предпочитаю использовать Humanizer для этого. Humanizer - это переносимая библиотека классов, которая отвечает всем вашим потребностям .NET для управления и отображения строк, перечислений, дат, времени, временных интервалов, чисел и количеств.

Короткий ответ

"AwaitingFeedback".Humanize() => Awaiting feedback

Длинный и описательный ответ

Humanizer может выполнять гораздо больше работы, другие примеры:

"PascalCaseInputStringIsTurnedIntoSentence".Humanize() => "Pascal case input string is turned into sentence"
"Underscored_input_string_is_turned_into_sentence".Humanize() => "Underscored input string is turned into sentence"
"Can_return_title_Case".Humanize(LetterCasing.Title) => "Can Return Title Case"
"CanReturnLowerCase".Humanize(LetterCasing.LowerCase) => "can return lower case"

Полный код:

using Humanizer;
using static System.Console;

namespace HumanizerConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine("AwaitingFeedback".Humanize());
            WriteLine("PascalCaseInputStringIsTurnedIntoSentence".Humanize());
            WriteLine("Underscored_input_string_is_turned_into_sentence".Humanize());
            WriteLine("Can_return_title_Case".Humanize(LetterCasing.Title));
            WriteLine("CanReturnLowerCase".Humanize(LetterCasing.LowerCase));
        }
    }
}

выход

В ожидании отзыва

Строка ввода регистра Pascal превращается в предложение

Подчеркнутая входная строка превращается в предложение. Может вернуть заглавную букву.

может вернуть нижний регистр

Если вы предпочитаете писать свой собственный код C #, вы можете достичь этого, написав часть кода C #, как уже отвечали другие.

8 голосов
/ 11 июля 2012

Обнаружено это в источнике MvcContrib, здесь пока не упоминается.

return Regex.Replace(input, "([A-Z])", " $1", RegexOptions.Compiled).Trim();
8 голосов
/ 07 июня 2012

Это похоже на @SSTA, но более эффективно, чем вызов TrimStart.

Regex.Replace("ThisIsMyCapsDelimitedString", "(\\B[A-Z])", " $1")
4 голосов
/ 27 ноября 2008

Вот основной способ сделать это, который я придумал, используя Regex

public static string CamelCaseToSentence(this string value)
{
    var sb = new StringBuilder();
    var firstWord = true;

    foreach (var match in Regex.Matches(value, "([A-Z][a-z]+)|[0-9]+"))
    {
        if (firstWord)
        {
            sb.Append(match.ToString());
            firstWord = false;
        }
        else
        {
            sb.Append(" ");
            sb.Append(match.ToString().ToLower());
        }
    }

    return sb.ToString();
}

Это также разделит числа, которые я не указал, но был бы полезен.

2 голосов
/ 27 ноября 2008
string camel = "MyCamelCaseString";
string s = Regex.Replace(camel, "([A-Z])", " $1").ToLower().Trim();
Console.WriteLine(s.Substring(0,1).ToUpper() + s.Substring(1));

Изменить: не заметил ваши требования к корпусу, соответственно изменены. Вы можете использовать matchevaluator для создания оболочки, но я думаю, что подстрока проще. Вы также можете обернуть его в замене 2-го регулярного выражения, где вы меняете первый символ

"^\w"

к верху

\U (i think)
2 голосов
/ 27 ноября 2008

Это легко сделать в JavaScript (или PHP и т. Д.), Где вы можете определить функцию в вызове replace:

var camel = "AwaitingFeedbackDearMaster";
var sentence = camel.replace(/([A-Z].)/g, function (c) { return ' ' + c.toLowerCase(); });
alert(sentence);

Хотя я не решил начальную проблему с кепкой ...: -)

Теперь для решения Java:

String ToSentence(String camel)
{
  if (camel == null) return ""; // Or null...
  String[] words = camel.split("(?=[A-Z])");
  if (words == null) return "";
  if (words.length == 1) return words[0];
  StringBuilder sentence = new StringBuilder(camel.length());
  if (words[0].length() > 0) // Just in case of camelCase instead of CamelCase
  {
    sentence.append(words[0] + " " + words[1].toLowerCase());
  }
  else
  {
    sentence.append(words[1]);
  }
  for (int i = 2; i < words.length; i++)
  {
    sentence.append(" " + words[i].toLowerCase());
  }
  return sentence.toString();
}

System.out.println(ToSentence("AwaitingAFeedbackDearMaster"));
System.out.println(ToSentence(null));
System.out.println(ToSentence(""));
System.out.println(ToSentence("A"));
System.out.println(ToSentence("Aaagh!"));
System.out.println(ToSentence("stackoverflow"));
System.out.println(ToSentence("disableGPS"));
System.out.println(ToSentence("Ahh89Boo"));
System.out.println(ToSentence("ABC"));

Обратите внимание на трюк, чтобы разбить предложение, не теряя ни одного символа ...

2 голосов
/ 27 ноября 2008

Я бы использовал регулярное выражение, вставляя пробел перед каждым символом верхнего регистра, а затем опуская всю строку.

    string spacedString = System.Text.RegularExpressions.Regex.Replace(yourString, "\B([A-Z])", " \k");
    spacedString = spacedString.ToLower();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...