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