Добавьте пробелы перед заглавными буквами - PullRequest
174 голосов
/ 07 ноября 2008

Учитывая строку «ThisStringHasNoSpacesButItDoesHaveCapitals», что является лучшим способом добавить пробелы перед заглавными буквами. Таким образом, конечная строка будет такой: «В этой строке нет пробелов, но есть заглавные буквы»

Вот моя попытка с RegEx

System.Text.RegularExpressions.Regex.Replace(value, "[A-Z]", " $0")

Ответы [ 30 ]

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

То, что у вас есть, работает отлично. Просто не забудьте переназначить value возвращаемому значению этой функции.

value = System.Text.RegularExpressions.Regex.Replace(value, "[A-Z]", " $0");
2 голосов
/ 21 апреля 2016

Вдохновленный от @MartinBrown, Две строки простого регулярного выражения, которое разрешит ваше имя, включая ациронимы в любом месте строки.

public string ResolveName(string name)
{
   var tmpDisplay = Regex.Replace(name, "([^A-Z ])([A-Z])", "$1 $2");
   return Regex.Replace(tmpDisplay, "([A-Z]+)([A-Z][^A-Z$])", "$1 $2").Trim();
}
2 голосов
/ 18 февраля 2016

Это регулярное выражение помещает пробел перед каждой заглавной буквой:

using System.Text.RegularExpressions;

const string myStringWithoutSpaces = "ThisIsAStringWithoutSpaces";
var myStringWithSpaces = Regex.Replace(myStringWithoutSpaces, "([A-Z])([a-z]*)", " $1$2");

Обратите внимание на пространство впереди, если "$ 1 $ 2", это то, что сделает это.

Это результат:

"This Is A String Without Spaces"
1 голос
/ 30 июня 2011
replaceAll("(?<=[^^\\p{Uppercase}])(?=[\\p{Uppercase}])"," ");
1 голос
/ 14 октября 2013

Я взял превосходное решение Кевина Страйкера и перешел на VB. Так как я заблокирован в .NET 3.5, мне также пришлось написать IsNullOrWhiteSpace. Это проходит все его испытания.

<Extension()>
Public Function IsNullOrWhiteSpace(value As String) As Boolean
    If value Is Nothing Then
        Return True
    End If
    For i As Integer = 0 To value.Length - 1
        If Not Char.IsWhiteSpace(value(i)) Then
            Return False
        End If
    Next
    Return True
End Function

<Extension()>
Public Function UnPascalCase(text As String) As String
    If text.IsNullOrWhiteSpace Then
        Return String.Empty
    End If

    Dim newText = New StringBuilder()
    newText.Append(text(0))
    For i As Integer = 1 To text.Length - 1
        Dim currentUpper = Char.IsUpper(text(i))
        Dim prevUpper = Char.IsUpper(text(i - 1))
        Dim nextUpper = If(text.Length > i + 1, Char.IsUpper(text(i + 1)) Or Char.IsWhiteSpace(text(i + 1)), prevUpper)
        Dim spaceExists = Char.IsWhiteSpace(text(i - 1))
        If (currentUpper And Not spaceExists And (Not nextUpper Or Not prevUpper)) Then
            newText.Append(" ")
        End If
        newText.Append(text(i))
    Next
    Return newText.ToString()
End Function
1 голос
/ 14 июня 2012
static string AddSpacesToColumnName(string columnCaption)
    {
        if (string.IsNullOrWhiteSpace(columnCaption))
            return "";
        StringBuilder newCaption = new StringBuilder(columnCaption.Length * 2);
        newCaption.Append(columnCaption[0]);
        int pos = 1;
        for (pos = 1; pos < columnCaption.Length-1; pos++)
        {               
            if (char.IsUpper(columnCaption[pos]) && !(char.IsUpper(columnCaption[pos - 1]) && char.IsUpper(columnCaption[pos + 1])))
                newCaption.Append(' ');
            newCaption.Append(columnCaption[pos]);
        }
        newCaption.Append(columnCaption[pos]);
        return newCaption.ToString();
    }
1 голос
/ 05 апреля 2017

Похоже, хорошая возможность для Aggregate. Это разработано, чтобы быть читаемым, не обязательно особенно быстрым.

someString
.Aggregate(
   new StringBuilder(),
   (str, ch) => {
      if (char.IsUpper(ch) && str.Length > 0)
         str.Append(" ");
      str.Append(ch);
      return str;
   }
).ToString();
1 голос
/ 27 июля 2012

В Ruby, через регулярное выражение:

"FooBarBaz".gsub(/(?!^)(?=[A-Z])/, ' ') # => "Foo Bar Baz"
0 голосов
/ 08 марта 2017

Вдохновленный ответом Binary Worrier, я взялся за это.

Вот результат:

/// <summary>
/// String Extension Method
/// Adds white space to strings based on Upper Case Letters
/// </summary>
/// <example>
/// strIn => "HateJPMorgan"
/// preserveAcronyms false => "Hate JP Morgan"
/// preserveAcronyms true => "Hate JPMorgan"
/// </example>
/// <param name="strIn">to evaluate</param>
/// <param name="preserveAcronyms" >determines saving acronyms (Optional => false) </param>
public static string AddSpaces(this string strIn, bool preserveAcronyms = false)
{
    if (string.IsNullOrWhiteSpace(strIn))
        return String.Empty;

    var stringBuilder = new StringBuilder(strIn.Length * 2)
        .Append(strIn[0]);

    int i;

    for (i = 1; i < strIn.Length - 1; i++)
    {
        var c = strIn[i];

        if (Char.IsUpper(c) && (Char.IsLower(strIn[i - 1]) || (preserveAcronyms && Char.IsLower(strIn[i + 1]))))
            stringBuilder.Append(' ');

        stringBuilder.Append(c);
    }

    return stringBuilder.Append(strIn[i]).ToString();
}

Проводил тестирование с использованием секундомера, выполняющего 10000000 итераций и различных длин строк и комбинаций.

В среднем на 50% (может быть, чуть больше) быстрее, чем ответ Binary Worrier.

0 голосов
/ 18 января 2016

Все предыдущие ответы выглядели слишком сложными.

У меня была строка со смесью заглавных букв и _, поэтому использовалась string.Replace () для создания _, "" и использовала следующее для добавления пробела в заглавные буквы.

for (int i = 0; i < result.Length; i++)
{
    if (char.IsUpper(result[i]))
    {
        counter++;
        if (i > 1) //stops from adding a space at if string starts with Capital
        {
            result = result.Insert(i, " ");
            i++; //Required** otherwise stuck in infinite 
                 //add space loop over a single capital letter.
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...