Просмотр вперед и назад в Dart
Иногда нужно решить задачу такого типа:
найти строку 'aaa' и заменить ее
на '!', но только если после
'aaa' стоит 'x', а сам
'x' при этом не заменять. Если мы
попытаемся решить задачу 'в лоб',
то у нас ничего не выйдет:
var txt = "aaax baaa";
var res = txt.replaceAll(RegExp(r'aaax'), "!");
print(res); // выведет '! baaa', а хотели '!x baaa'
Для решения задачи нужен способ сказать,
что 'x' не следует заменять. Делается
это .
Эти скобки называются позитивный просмотр
вперед. Позитивный - так как 'x'
(в нашем случае) должен быть - только тогда
произойдет замена.
Применим эти скобки для решения нашей задачи:
var txt = "aaax baaa";
var res = txt.replaceAll(RegExp(r'aaa(?=x)'), "!");
print(res); // выведет '!x aaab
Есть и негативный просмотр вперед
- (?! ) - он, наоборот, говорит,
что чего-то должно не быть. В следующем
примере, замена произойдет, только если
после 'aaa' стоит НЕ 'x':
var txt = "aaax aaab";
var res = txt.replaceAll(RegExp(r'aaa(?!x)'), "!");
print(res); // выведет 'aaax !b'
Аналогичным образом есть позитивный
просмотр назад - (?<= ). В
следующем примере замена произойдет, только
если перед 'aaa' стоит 'x':
var txt = "xaaa";
var res = txt.replaceAll(RegExp(r'(?<=x)aaa'), "!");
print(res); // выведет 'x!'
И есть также негативный просмотр назад
- (?<! ). В следующем примере
замена произойдет, только если перед
'aaa' не стоит 'x':
var txt = "baaa";
var res = txt.replaceAll(RegExp(r'(?<!x)aaa'), "!");
print(res); // выведет 'b!'
Дана строка, содержащая имена функций:
var txt = "func1() func2() func3()";
Получите массив имен функций из строки.
Дана строка с тегом:
var txt = "<a href=\"\" class=\"eee\" id=\"zzz\">";
Получите массив имен атрибутов этого тега.
Дана строка с переменными:
var txt = "$aaa $bbb $ccc xxxx";
Получите подстроки, перед которыми стоит символ доллара.