2014-12-18 3 views
2

Я хочу получить список подстрок, соответствующих RegExp в строке. Каков наилучший способ сделать это?Лучший способ получить все подстроки, соответствующие RegExp в Dart

RegExp объект из дротик: core есть Iterable<Match> allMatches(String input, [int start=0]) способ. Это то, что мне нужно, но я хочу получить Iterable of Strings, а не совпадения.

Существует также метод String stringMatch(String input), который возвращает строку, но только первое совпадение.

Так что я написал myslef эту функцию с помощью map:

Iterable<String> _allStringMatches(String text, RegExp regExp) { 
    Iterable<Match> matches = regExp.allMatches(text); 
    List<Match> listOfMatches = matches.toList(); 

    // TODO: there must be a better way to get list of Strings out of list of Matches 
    Iterable<String> listOfStringMatches = listOfMatches.map((Match m) { 
    return m.input.substring(m.start, m.end); 
    }); 

    return listOfStringMatches; 
} 

, но мне кажется, что это довольно основные функциональные возможности, и я не могу поверить, что это не в любом месте в API. Я предполагаю, что должен быть лучший способ выполнить такую ​​основную задачу.

+0

Можете ли вы опубликовать пример строки и что подстроки вы хотите? Вы можете просто перебрать все совпадения и получить 'group (n)', с n = 0 для всего матча и других n для частей. – Robert

+0

'group (0)' совпадения возвращает всю строку, сопоставленную. Вы можете немного упростить свой код, используя его. – fog

+0

См. Мое сообщение, @fog :) – Robert

ответ

4

Если регулярное выражение содержит только одна группа (как new RegExp(r'(\S+)')) вы можете переписать функцию:

Iterable<String> _allStringMatches(String text, RegExp regExp) => 
    regExp.allMatches(text).map((m) => m.group(0)); 
+2

Еще короче: 'regexp.allMatches (текст) .map ((m) => m [0])'. – lrn

Смежные вопросы