(?(?=((?<=\d\s))*)(\d+\s)*)(абв)(?=(\s\d+)*)
Результат
Данная регулярка работает только в PCRE (PHP)
p.s.
<?php
function str_replace_once($search, $replace, $text){
$pos = strpos($text, $search);
return $pos!==false ? substr_replace($text, $replace, $pos, strlen($search)) : $text;
}
$st = '123 абв 123 абв абв 123 абв';
$pattern = '~(?(?=((?<=\d\s))*)(\d+\s)*)(абв)(?=(\s\d+)*)~ium';
$flag = true;
$res = [];
do{
if (preg_match($pattern,$st, $search)){
$do = !empty($search[2])?$search[2]:null;
$po = !empty($search[4])?$search[4]:null;
$st = str_replace_once($search[3] , '', $st);
$res[]= [$do , $search[3], $po];
}else {
$flag = false;
}
}while($flag);
var_dump($res);
/*
array(4) {
[0]=>
array(3) {
[0]=>
string(4) "123 "
[1]=>
string(6) "абв"
[2]=>
string(4) " 123"
}
[1]=>
array(3) {
[0]=>
string(4) "123 "
[1]=>
string(6) "абв"
[2]=>
NULL
}
[2]=>
array(3) {
[0]=>
NULL
[1]=>
string(6) "абв"
[2]=>
string(4) " 123"
}
[3]=>
array(3) {
[0]=>
string(4) "123 "
[1]=>
string(6) "абв"
[2]=>
NULL
}
}
*/
оказалась что preg_match_all не поддерживает данный стандарт... пришлось сделать такой велосипед... Очень интересно как сделать глобал поиск по строке с регуляркой которая смотрит вперед и назад.
БУДУ НАДЕЯТЬСЯ ЧТО КТО-НИБУДЬ ТУТ ОТПИШЕТ!