Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нахождение всех вхождений между одинаковыми блоками
 
 автор: dtopenya   (01.04.2012 в 21:53)   письмо автору
 
 

Всем привет.
Есть строка CODE1234CODE5678CODE, вместо цифр могут быть любые значения, которые всегда идут между последовательностью символов CODE. При этом искомые значения всегда состоят из четного количества символов.
Если использовать CODE в начале и конце регулярки, то получим только первое значение, т.е. 1234, т.к. CODE не будет учитываться при втором проходе, а надо найти все.

Пробую так: CODE(.{2})+?(?:(?!CODE).{2})+?
Находятся только по 2 первых символа искомых значений, т.к. (.{2})+? - в скобках только 2 символа, перестановка скобки дальше вызывает ошибку.

Пробовал другие варианты, но получаю либо первые 2 символа искомых значений, либо ничего.
Если писать CODE в начале и конце, то теряю значения из-за того, что данный блок входит в регулярку и не используется на четных проходах.

Как можно решить проблему одной регуляркой?
Или возможно как-нибудь заставить регулярку последний блок CODE использовать в следующем проходе?

  Ответить  
 
 автор: Sfinks   (01.04.2012 в 23:02)   письмо автору
 
   для: dtopenya   (01.04.2012 в 21:53)
 

Вариант 1 (правильный):
CODE((?:.(?!CODE))+.)

Вариант 2 (альтернативный):
DE(.+?)CO

  Ответить  
 
 автор: dtopenya   (01.04.2012 в 23:17)   письмо автору
 
   для: Sfinks   (01.04.2012 в 23:02)
 

Где тут условие проверки на длину из количества символов?

В регулярке, которую в конечном итоге хочу поправить, есть еще несколько внутренних блоков.
В идеале решением моей проблемы был бы вариант, когда закрывающий блок одного прохода участвовал бы в следующем проходе в качестве начального блока.

Такое реализуемо?

  Ответить  
 
 автор: Sfinks   (02.04.2012 в 00:38)   письмо автору
 
   для: dtopenya   (01.04.2012 в 23:17)
 

> Где тут условие проверки на длину из количества символов?
Не понял сразу. Вот с условием
CODE((?:.{2})+?)(?=CODE)

> вариант, когда закрывающий блок одного прохода участвовал бы в следующем проходе
> в качестве начального блока

Что вы называете закрывающим блоком? И о каких проходах речь? У РВ всегда один проход. Возможно только заглянуть вперед(назад) от текущего места текущего и единственного прохода.

  Ответить  
 
 автор: dtopenya   (02.04.2012 в 10:03)   письмо автору
 
   для: Sfinks   (02.04.2012 в 00:38)
 

Проходы в моем понимании - это каждый шаг поиска по шаблону, когда указан ключ g.
Речь шла об этом:
1-й проход: CODE1234CODE
2-й проход: остается только 5678CODE
а хотелось, чтобы было:
1-й проход: CODE1234CODE
2-й проход: остается только CODE5678CODE

Ваш пример CODE((?:.{2})+?)(?=CODE) выдает нужные значения, видимо, работает так, как мне и надо.:)
Спасибо, попробую прикрутить к своей регулярке.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования