Разделить строку 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
,
Строка / параграф / предложение, включающее Сокращения, может быть преобразована в удобочитаемые предложения / строку. Я просто пытался отформатировать строку в 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();
}