Лучший способ преобразовать Pascal-регистр в предложение

72
задан Mike Cole 9 May 2013 в 22:03
поделиться

10 ответов

Главным образом уже ответил здесь

Маленький chage к принятому ответу, для преобразования вторых и последующих Капитализированных букв в нижний регистр, так изменение

if (char.IsUpper(text[i]))                
    newText.Append(' ');            
newText.Append(text[i]);

к

if (char.IsUpper(text[i]))                
{
    newText.Append(' ');            
    newText.Append(char.ToLower(text[i]));
}
else
   newText.Append(text[i]);
0
ответ дан Community 24 November 2019 в 12:39
поделиться

Псевдокод:

NewString = "";
Loop through every char of the string (skip the first one)
   If char is upper-case ('A'-'Z')
     NewString = NewString + ' ' + lowercase(char)
   Else
     NewString = NewString + char

Лучшие пути могут, возможно, быть сделаны при помощи regex, или строковыми заменяющими стандартными программами (замените 'X' 'x')

1
ответ дан schnaader 24 November 2019 в 12:39
поделиться

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

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
ответ дан PhiLho 24 November 2019 в 12:39
поделиться
string camel = "MyCamelCaseString";
string s = Regex.Replace(camel, "([A-Z])", " $1").ToLower().Trim();
Console.WriteLine(s.Substring(0,1).ToUpper() + s.Substring(1));

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

"^\w"

к верхнему

\U (i think)
2
ответ дан Andrew Bullock 24 November 2019 в 12:39
поделиться

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

    string spacedString = System.Text.RegularExpressions.Regex.Replace(yourString, "\B([A-Z])", " \k");
    spacedString = spacedString.ToLower();
2
ответ дан Antoine 24 November 2019 в 12:39
поделиться

Вот основной способ сделать его, что я придумал использование 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();
}

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

4
ответ дан Garry Shutler 24 November 2019 в 12:39
поделиться

Здесь Вы идете...

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();
        }
    }
}
15
ответ дан Autodidact 24 November 2019 в 12:39
поделиться
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])}");
}

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

68
ответ дан 24 November 2019 в 12:39
поделиться

An xquery solution that works for both UpperCamel and lowerCamel case:

To output sentence case (only the first character of the first word is capitalized):

declare function content:sentenceCase($string)
{
let $firstCharacter := substring($string, 1, 1)
let $remainingCharacters := substring-after($string, $firstCharacter)
return
concat(upper-case($firstCharacter),lower-case(replace($remainingCharacters, '([A-Z])', ' $1')))
};

To output title case (first character of each word capitalized):

declare function content:titleCase($string)
{
let $firstCharacter := substring($string, 1, 1)
let $remainingCharacters := substring-after($string, $firstCharacter)
return
concat(upper-case($firstCharacter),replace($remainingCharacters, '([A-Z])', ' $1'))
};
1
ответ дан 24 November 2019 в 12:39
поделиться

У меня это работает:

Regex.Replace(strIn, "([A-Z]{1,2}|[0-9]+)", " $1").TrimStart()
15
ответ дан 24 November 2019 в 12:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: