Вы хотите разделить перед заглавными буквами, кроме первой.Простое разбиение заглавными буквами (ну, по крайней мере, ASCII-буквы) легко:
// Single character look-ahead for capital letter.
final beforeCapitalLetter = RegExp(r"(?=[A-Z])");
...
var parts = string.split(beforeCapitalLetter);
Проблема здесь в том, что он разбивается и до первой буквы, давая вам пустой первый элемент в результирующих частях.Вы можете просто удалить это, если вы уверены, что оно есть.
if (parts.isNotEmpty && parts[0].isEmpty) parts = parts.sublist(1);
Или вы можете стать умнее с помощью RegExp:
// Matches before a capital letter that is not also at beginning of string.
final beforeNonLeadingCapitalLetter = RegExp(r"(?=(?!^)[A-Z])");
List<String> splitPascalCase(String input) =>
input.split(beforeNonLeadingCapitalLetter);
Пример результатов:
print(splitPascalCase("HelloWorld")); // [Hello, World]
print(splitPascalCase("One")); // [One]
print(splitPascalCase("none")); // [none]
print(splitPascalCase("BFG9000")); // [B, F, G9000]
print(splitPascalCase("XmlHTTPRequest")); // [Xml, H, T, T, P, Request]
(Возможно, вы захотите решить, является ли последнее, что вы хотите).
Другой вариант - не split , а совпадение частей, которые вы хотите.
final pascalWords = RegExp(r"(?:[A-Z]+|^)[a-z]*");
List<String> getPascalWords(String input) =>
pascalWords.allMatches(input).map((m) => m[0]).toList();
Извлекает все слова, начинающиеся с одной или нескольких заглавных букв (или в начале строки).Если ваша строка содержит только буквы, она должна делать примерно то же, что и предыдущая функция.Если он содержит другие вещи, то они игнорируются.
print(getPascalWords("BFG9000")); // [BFG]
print(getPascalWords("XmlHTTPRequest")); // [Xml, HTTPRequest]
Какой из них выбрать, зависит от того, какие строки вы ожидаете получить в качестве входных данных, и как вы хотите обрабатывать крайние случаи: Смежные заглавные буквы?Все заглавные буквы?Пустая строка?
Если это всегда конкатенация одного или нескольких двухбуквенных или более длинных слов с заглавной первой буквой, то это только простые случаи, и любой метод будет работать.