.NET - Как можно разделить “ограничения”, разграничила строку в массив?

@ user2754799 имеет правильный метод, но я сделал пару небольших изменений, чтобы ответить на мой вопрос. Если они хотят отредактировать свой ответ с помощью этого решения, я соглашусь с ним.

d <- as.integer(as.POSIXct(strptime("2015-01-01","%Y-%m-%d"))) * 1000
## or more concisely
## d <- as.integer(as.POSIXct("2015-01-01")) * 1000
data <- mong$find(paste0('{"dte":{"$gt": { "$date" : { "$numberLong" : "', d, '" } } } }'))
112
задан Drew Noakes 12 February 2009 в 11:17
поделиться

9 ответов

Я сделал это только что. Это соответствует каждому компоненту названия CamelCase.

/([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z]+)/g

, Например:

"SimpleHTTPServer" => ["Simple", "HTTP", "Server"]
"camelCase" => ["camel", "Case"]

Для преобразования этого, чтобы просто вставить пробелы между словами:

Regex.Replace(s, "([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))", "$1 ")
<час>

, Если необходимо обработать цифры:

/([A-Z]+(?=$|[A-Z][a-z]|[0-9])|[A-Z]?[a-z]+|[0-9]+)/g

Regex.Replace(s,"([a-z](?=[A-Z]|[0-9])|[A-Z](?=[A-Z][a-z]|[0-9])|[0-9](?=[^0-9]))","$1 ")
170
ответ дан Markus Jarderot 5 November 2019 в 09:34
поделиться

Для большего разнообразия, с помощью простых объектов C#, следующее производит тот же вывод как превосходное регулярное выражение @MizardX.

public string FromCamelCase(string camel)
{   // omitted checking camel for null
    StringBuilder sb = new StringBuilder();
    int upperCaseRun = 0;
    foreach (char c in camel)
    {   // append a space only if we're not at the start
        // and we're not already in an all caps string.
        if (char.IsUpper(c))
        {
            if (upperCaseRun == 0 && sb.Length != 0)
            {
                sb.Append(' ');
            }
            upperCaseRun++;
        }
        else if( char.IsLower(c) )
        {
            if (upperCaseRun > 1) //The first new word will also be capitalized.
            {
                sb.Insert(sb.Length - 1, ' ');
            }
            upperCaseRun = 0;
        }
        else
        {
            upperCaseRun = 0;
        }
        sb.Append(c);
    }

    return sb.ToString();
}
4
ответ дан Robert Paulson 5 November 2019 в 09:34
поделиться

Существует, вероятно, более изящное решение, но это - то, что я придумываю первое, что пришло на ум:

string myString = "ThisIsMyCapsDelimitedString";

for (int i = 1; i < myString.Length; i++)
{
     if (myString[i].ToString().ToUpper() == myString[i].ToString())
     {
          myString = myString.Insert(i, " ");
          i++;
     }
}
0
ответ дан Max Schmeling 5 November 2019 в 09:34
поделиться

Превосходный комментарий Grant Wagner в стороне:

Dim s As String = RegularExpressions.Regex.Replace("ThisIsMyCapsDelimitedString", "([A-Z])", " $1")
11
ответ дан Pseudo Masochist 5 November 2019 в 09:34
поделиться

Только для небольшого разнообразия... Вот дополнительный метод, который не использует regex.

public static class CamelSpaceExtensions
{
    public static string SpaceCamelCase(this String input)
    {
        return new string(Enumerable.Concat(
            input.Take(1), // No space before initial cap
            InsertSpacesBeforeCaps(input.Skip(1))
        ).ToArray());
    }

    private static IEnumerable<char> InsertSpacesBeforeCaps(IEnumerable<char> input)
    {
        foreach (char c in input)
        {
            if (char.IsUpper(c)) 
            { 
                yield return ' '; 
            }

            yield return c;
        }
    }
}
18
ответ дан jpmc26 5 November 2019 в 09:34
поделиться
Regex.Replace("ThisIsMyCapsDelimitedString", "(\\B[A-Z])", " $1")
36
ответ дан Wayne 5 November 2019 в 09:34
поделиться

Большой ответ, MizardX! Я настроил его немного для обработки цифр как отдельных слов, так, чтобы "AddressLine1" стал "Строкой адреса 1" вместо "Адреса Line1":

Regex.Replace(s, "([a-z](?=[A-Z0-9])|[A-Z](?=[A-Z][a-z]))", "$1 ")
19
ответ дан JoshL 5 November 2019 в 09:34
поделиться
string s = "ThisIsMyCapsDelimitedString";
string t = Regex.Replace(s, "([A-Z])", " $1").Substring(1);
2
ответ дан Ferruccio 5 November 2019 в 09:34
поделиться

Наивное regex решение. Не обработает O'Conner и добавляет пространство в начале строки также.

s = "ThisIsMyCapsDelimitedString"
split = Regex.Replace(s, "[A-Z0-9]", " $&");
1
ответ дан Geoff 24 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

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