Вы можете построить шаблон динамически:
var keys = ['dev', 'soft', 'angular', 'java'];
var regex = new RegExp("\\b(?:${keys.join('|')})\\b", caseSensitive: false);
var contactsAll = ['No match', 'I like java', 'I like javascript'];
var cc = contactsAll.where( (i) => regex.hasMatch(i) ).toList();
print(cc); // => [I like java]
Регулярное выражение будет выглядеть как \b(?:dev|soft|angular|java)\b
и будет соответствовать любому из ключевых слов в группе без захвата как целое слово из-за \b
границ слова . См. Демонстрационную версию regex .
Если keys
может содержать специальные символы, но вам все еще нужен поиск по целому слову, вам нужно экранировать все специальные символы и использовать либо однозначный Границы
var regex = new RegExp("(?:^|\\W)(?:${keys.map((val) => val.replaceAll(new RegExp(r'[-\/\\^$*+?.()|[\]{}]'), r'\\$&')).join('|')})(?!\\w)", caseSensitive: false);
В результате получается шаблон (?:^|\W)(?:dev|soft|angular|java)(?!\w)
( см. демонстрацию ), где (?:^|\W)
соответствует началу строки или несловесному символу, а для (?!\w)
требуется Отсутствие слова char непосредственно справа от текущего местоположения.
.map((val) => val.replaceAll(new RegExp(r'[-\/\\^$*+?.()|[\]{}]'), r'\\$&'))
part экранирует буквальную часть для использования в регулярном выражении .
или Пробельные границы :
var regex = new RegExp("(?:^|\\s)(?:${keys.map((val) => val.replaceAll(new RegExp(r'[-\/\\^$*+?.()|[\]{}]'), r'\\$&')).join('|')})(?!\\S)", caseSensitive: false);
В результате получается шаблон (?:^|\s)(?:dev|soft|angular|java)(?!\S)
, где (?:^|\s)
соответствует началу строки или пробела, а (?!\S)
требует немедленного отсутствия непробельного символа справа от текущего местоположения.
См. демонстрационную версию regex .