Помогите с регекспом

nik93

мне нужно выцепить из текста последовательность вида
 
 (\d{3})+ 

потом разбить ее на тройки и каждую тройку как-то обработать.
Например из текста: "бла бла бла 001002003 бла бла" нужно вытащить "001002003" и обработать по отдельности "001" "002" и "003".
Мне казалось что эти тройки можно автоматом выцепить регекспом с помощью capturing groups, но максимум что я могу придумать это ((\d{3})+) который на строке выше дает только два матча 001002003 и 003.
Можно ли что-то еще сделать, или это невозможно в рамках регекспа?

katrin2201

если твои регэкспы поддерживают look-ahead/behind, то можно так:
((?=\d{3})(\d{3}))|((\d{3})(?<=\d{3}))

uncle17


<?php
$a = "бла бла бла 001002003 004005006 бла бла";
preg_match_all('/(\d{3})/' ,$a, $matches);
var_dump($matches[0]);
?>


# php test.php
array(6) {
[0] =>
string(3) "001"
[1] =>
string(3) "002"
[2] =>
string(3) "003"
[3] =>
string(3) "004"
[4] =>
string(3) "005"
[5] =>
string(3) "006"
}

hoha32

твой матч "не в курсе" к каким объединениям принадлежали эти тройки до разбития

hoha32

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

nik93

если твои регэкспы поддерживают look-ahead/behind, то можно так:
((?=\d{3})(\d{3}))|((\d{3})(?<=\d{3}))
тестирую тут http://www.regex101.com/
твой пример не работает

nik93

твой матч "не в курсе" к каким объединениям принадлежали эти тройки до разбития
в данном случае это не важно, в тексте максимум одна такая строка

Marinavo_0507

(\d\d\d)(\d\d\d)(\d\d\d)
или я чего-то не понимаю?

nik93

там строка вида (\d{3})+ этих ddd может быть десяток

Marinavo_0507

> этих ddd может быть десяток
поясни, что ты в этом случае хочешь получить?

katrin2201

буковку g в модифайеры добавил?

nik93

десяток матчей на каждый \d\d\d

nik93

шайтан! :) спасибо, буду вникать.

uncle17

шайтан!
Эммм... Это ж очевидно было

katrin2201

да, сорри, вот так лучше (первый вариант одиночные тройки что-то тоже матчит):
(((?<=\d{3})\d{3})|(\d{3}(?=\d{3})))
велкам!

nik93

одиночные тройки что-то тоже матчит
и хорошо, одиночные тоже могут быть

katrin2201

оу, тогда стоп, тогда еще раз для тупых, чем просто (\d{3}) с модифайером g не подходит?

nik93

оу, тогда стоп, тогда еще раз для тупых, чем просто (\d{3}) с модифайером g не подходит?
для задачи из первого поста подходит. Я насамом деле был не вкурсе про g поэтому слишком упростил наверно.
Дальше задача усложняется различными обрамлениями для искомых строк типа "x1(\d{3})+;" и прочего бреда который долго объяснять, вот там только твой шайтан-запрос поможет. Главная цель - вытащить тройки в матчгруппы, достигнута.
Оставить комментарий
Имя или ник:
Комментарий: