|
|
автор: .heed (21.02.2013 в 00:06) |
|
|
для: dima_dima
(20.02.2013 в 16:40)
| | ... или так
<xmp><?php
$txt = '%1%2%%3%%%4%5';
preg_match_all('#(?<!%)(?:%%)*(%\d+)#', $txt, $o);
print_r($o); | |
|
|
|
|
автор: .heed (21.02.2013 в 00:00) |
|
|
для: dima_dima
(20.02.2013 в 16:40)
| | > На Java оно не работает т.к. длина обратной проверки не определена
непонятно зачем тогда там (?<!^|[^%])
может быть так будет работать
<xmp><?php
$txt = '%1%2%%3%%%4%5';
preg_match_all('#(?<!%)%\d+#', $txt, $o);
print_r($o);
|
| |
|
|
|
|
|
|
| Всем привет!
Упрощённо задача сводится к тому, чтобы из строки вычленить все цифры с предшествующим процентом, при условии, что процентов перед ней нечетное количество.
Т.е. для строки:
%1%2%%3%%%4%5
Результат должен быть
%1
%2
%4
%5
%3 не попадает т.к. перед цифрой3 чётное число процентов.
Сперва подобрал такое выражение:
(?<!(?:^|[^%])(?:%%)*%)(%[12345])
|
Работало отлично, пока не попробовал его на Java. На Java оно не работает т.к. длина обратной проверки не определена (количество повторений %% любое (*))
Сейчас пробую переделать на выражение без обратной проверки.
Получилось пока так:
(^|[^%]|[^%](%%)+)(%[12345])
|
т.е. выбрать % с последующей цифрой, если перед ним либо начало строки, либо не %, либо чётное число процентов.
Проблема в том, что в строке %1%2%%3%%%4%5 мы находим первое совпадение %1, а вот %2 не удовлетворяет выражению. Подозреваю, что это происходит потому, что символ, который стоит перед %2 (т.е. символ 1) уже вошёл в предыдущее совпадение. И что сейчас стоит перед %2 не понятно.
Собственно вопрос: как быть в таком случае? Как сравнить с символом, который уже вошёл в предыдущее совпадение? И что там за символ стоит?
Спасибо. | |
|
|
|
|