Format string based on characters

I would like to format my string to make a space before each uppercase letter followed by a small character.

I am currently using this

public static string FormatCaseConvention(string text)
{
    var formatted = String.Empty;
    foreach (char letter in text)
    {
        if (Char.IsUpper(letter) && formatted.Length > 0)
        {
            formatted += " " + letter;
        }
        else
        {
            formatted += letter;
        }
    }

    return formatted;
}

But if the input is something like "SQLData", it returns as SQL Data. I want my formatter to return "SQL data". Thanks.

+4
source share
4 answers

Here is the RegEx approach

string Input = "SQLData";
string Result = Regex.Replace(Input, "[A-Z][a-z]", " $0");  //SQL Data

Expression: [A-Z][a-z]capital letter followed by a small letter

+4
source

AFTER UPDATE

Just change your code to this one, it works great.

, .

public static string FormatCaseConvention(string text)
{
    string text = "SQLDataABCHumaAdADScVascASCasASCasASCTumEKa";
    var formatted = String.Empty;
    int i = 0;
    var totalLeangth = text.Length;
    foreach (char letter in text)
    {
        if (Char.IsUpper(letter) && i < totalLeangth - 1)
        {
            if (char.IsLower(text[i + 1]) && char.IsLower(text[i - 1]))
                formatted += letter;

            else if (char.IsLower(text[i + 1]))
                formatted += " " + letter;

            else
                formatted += letter;
        }
        else if (i == totalLeangth - 1)
        {
            if (Char.IsUpper(letter) && char.IsUpper(text[i - 1]))
                formatted += letter;

            else if(Char.IsUpper(text[i-1]))                
                formatted += letter;                

            else                
                formatted += " " + letter;              
        }
        else if (Char.IsLower(letter) && char.IsUpper(text[i + 1]))
        {
            formatted += letter + " ";
        }
        else
        {
            formatted += letter;
        }
        i = i + 1;
    }
}
+2

, , DataSQLData​​p >

String text  = "DataSQLData";
Regex reg = new Regex(@"[A-Z][a-z]+(?=\w*)");
reg.Replace(text, " $0 ").Trim().Dump();
0
<Extension()>
Public Function TurnIntoWords(Str As String, Optional Separator As String = " ") As String
  Dim Res As New StringBuilder(If(Str.Length, Str(0), "")), Ch As Char

  For Q As Integer = 1 To Str.Length - 2
    Ch = Str(Q)
    If _
      Char.IsUpper(Ch) _
      AndAlso (Char.IsLower(Str(Q - 1)) OrElse Char.IsLower(Str(Q + 1))) _
    Then
      Res.Append(Separator)
    End If

    Res.Append(Ch)
  Next Q

  If Str.Length Then Res.Append(Str(Str.Length - 1))

  Return Res.ToString()
End Function
public static string TurnIntoWords(this string Str, string Separator = " ")
{
    StringBuilder Res = new StringBuilder(Str.Length != 0 ? Str[0].ToString() : "");
    char Ch = '\0';

    for (int Q = 1; Q <= Str.Length - 2; Q++)
    {
        Ch = Str[Q];

        if (char.IsUpper(Ch) && (char.IsLower(Str[Q - 1]) || char.IsLower(Str[Q + 1])))
            Res.Append(Separator);

        Res.Append(Ch);
    }

    if (Str.Length != 0)
        Res.Append(Str[Str.Length - 1]);

    return Res.ToString();
}
0
source

Source: https://habr.com/ru/post/1628276/


All Articles