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

У меня есть список слов, которые нужно сделать удобочитаемыми для человека, например, "Имя от имени", "Фамилия от имени", а в некоторых случаях такие аббревиатуры, как "ARB", остаются без изменений. Последний был недавно представлен и вызвал проблему с отображением, так как наше регулярное выражение возвращает AR B. Вот то, что у нас есть, что, как я знаю, недостаточно для сокращений:

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

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

Обновление: вот код использования

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

3 ответа

Решение

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

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

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

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

Тестовые данные:

Ввод: "QWERTYSomeThing OmitTRYSomeThing MayBeWorkingFYI"

Вывод: "QWERTY Некоторые вещи пропускают TRY Некоторые вещи могут работать к вашему сведению"

Код: передать строку ввода в метод, указанный ниже.

    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] : '\0';

                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();
    }
Другие вопросы по тегам