Разделить строку PascalCase на отдельные слова, используя Dart? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть слово HelloWorld, которое я хочу разделить на Hello & World, как мне это сделать в Dart?

В настоящее время у меня есть -

String str = 'HelloWorld';

И я не знаю, как идти дальше?

Я пробовал RegExp как

words = str.split(new RegExp(r"[A-Z]"));

Но это не работает.Как мне отделить Hello & World?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

titleCase из https://pub.dartlang.org/packages/recase обеспечивает, что (среди многих других)

var recase = ReCase(str);
print(recase.titleCase);
0 голосов
/ 11 декабря 2018

Вы хотите разделить перед заглавными буквами, кроме первой.Простое разбиение заглавными буквами (ну, по крайней мере, 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]

Какой из них выбрать, зависит от того, какие строки вы ожидаете получить в качестве входных данных, и как вы хотите обрабатывать крайние случаи: Смежные заглавные буквы?Все заглавные буквы?Пустая строка?

Если это всегда конкатенация одного или нескольких двухбуквенных или более длинных слов с заглавной первой буквой, то это только простые случаи, и любой метод будет работать.

0 голосов
/ 11 декабря 2018

Вы можете попробовать это

r"(?<=[a-z])(?=[A-Z])"

Пояснение

  • (?<=[a-z]) - Положительный взгляд сзади.Соответствует любой строчной букве.
  • (?=[A-Z]) - положительный прогноз. Сопоставляет любую заглавную букву.

    void main() {
    
       String str = 'HelloWorld';
       var words = str.split(new RegExp(r"(?<=[a-z])(?=[A-Z])"));
       print(words);
    }
    

Печать -> [Hello, World];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...