Разделить строку PascalCase, за исключением аббревиатур

у меня есть список слов, которые нужно сделать удобочитаемыми для человека, таких как имя к имени, фамилия к фамилии, а в некоторых случаях аббревиатуры, такие как ARBs, остаются как есть. Последнее было недавно введено и вызвало проблему с отображением, так как наше регулярное выражение возвращает AR Bs. Вот что у нас есть, чего, я знаю, недостаточно для аббревиатур:

([A-Z][a-z]+)

Я нашел другие выражения на SO и на других сайтах, которые могут работать с аббревиатурами, однако они работают со строками, где аббревиатура в строке, а не всю строку. Я могу делать простые регулярные выражения, но это слишком сложно для моих навыков. Я бы привел другие примеры для тестирования, если бы они у меня были, но все строки работают нормально, кроме новой, ARBs. Спасибо.

Update: вот использование кода

string friendlyName = Regex.Replace(field.Name, "([A-Z][a-z]+)", " ", RegexOptions.Compiled).Trim();

3 ответов


не [A-Z]+[a-z]* сделать это? Это должно совпадать с одной или несколькими строчными буквами, за которыми следует ноль или более строчных букв. Так что ARBs останется единым целым, но CamelCase будет разделен на Camel Case.


Как насчет этого?

[A-Z][a-z]+|[A-Z]

строка / абзац / предложение, включая аббревиатуры, могут быть преобразованы в удобочитаемые предложения / строку. Я просто пытался форматировать строку Pascal Cased, я исследовал больше и попытался даже преобразовать аббревиатуры в понятный формат.

Тестовых Данных:

вход: "QWERTYSomeThing OmitTRYSomeThing MayBeWorkingFYI"

выход: " QWERTY некоторые вещи опускают попробовать что-то может работать FYI"

код: Передайте входную строку методу, приведенному ниже.

    private static string FormatPascalAndAcronym(string input)
    {
        var builder = new StringBuilder(input[0].ToString());
        if (builder.Length > 0)
        {
            for (var index = 1; index < input.Length; index++)
            {
                char prevChar = input[index - 1];
                char nextChar = index + 1 < input.Length ? input[index + 1] : '';

                bool isNextLower = Char.IsLower(nextChar);
                bool isNextUpper = Char.IsUpper(nextChar);
                bool isPresentUpper = Char.IsUpper(input[index]);
                bool isPrevLower = Char.IsLower(prevChar);
                bool isPrevUpper = Char.IsUpper(prevChar);

                if(!string.IsNullOrWhiteSpace(prevChar.ToString()) && 
                    ((isPrevUpper&& isPresentUpper && isNextLower) || 
                    (isPrevLower&&isPresentUpper&&isNextLower)||
                    (isPrevLower&&isPresentUpper&&isNextUpper)))
                {
                    builder.Append(' ');
                    builder.Append(input[index]);
                }
                else{
                builder.Append(input[index]);
                }
            }
        }
        return builder.ToString();
    }