Разделить строку PascalCase, за исключением сокращений - PullRequest
7 голосов
/ 14 декабря 2011

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

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 14 декабря 2011

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

0 голосов
/ 30 мая 2014

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

Данные испытаний :

Ввод:"QWERTYSomeThing OmitTRYSomeThing MayBeWorkingFYI"

Вывод:"QWERTY Что-то пропускается, ПОПРОБУЙТЕ, что-то может работать К вашему сведению"

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

    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();
    }
0 голосов
/ 14 декабря 2011

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

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