PHP Regexp (PCRE) - найти набор всех подстрок - PullRequest
3 голосов
/ 08 марта 2011

У меня есть следующая строка, например:

aaXXccYYeeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZvv

Как найти все XX.*YY.*ZZ части в строке? (возможно, используя preg_match())

  • XX куб.см ГГ eeXX_ ZZ
  • XX _ ZZkk ГГ ммХХ _ ZZ
  • XX _ ZZnnXXoo YY uuXX _ ZZ
  • XX оо ГГ uuXX_ ZZ

Плюс все более длинные совпадения, как:

  • XX куб.см ГГ eeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ ZZ

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Спасибо всем за помощь.

Мое решение на основе решения ' bobbogo '.Спасибо.

Регулярное выражение:

(?=(XX.*?YY.*?ZZ))(?=(.*ZZ))

Результат (от RegexBuggy):

1 XXccYYeeXX_ZZ     XXccYYeeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZ
2 XX_ZZkkYYmmXX_ZZ      XX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZ
3 XX_ZZnnXXooYYuuXX_ZZ  XX_ZZnnXXooYYuuXX_ZZ
4 XXooYYuuXX_ZZ     XXooYYuuXX_ZZ

Возможно этоможет по более оптимизированному?Я не большой профессионал в области регулярных выражений.

1 голос
/ 08 марта 2011

На первый взгляд это кажется довольно простым (извинения, если я что-то упустил). Для первой части используйте повторяющиеся совпадения:

XX(.*?)YY(.*?)ZZ

Для более длительного матча я предлагаю отдельный матч:

XX(.*?)YY(.*)ZZ

EDIT

Aha! шаблоны перекрываются (спасибо, ребята). В этом случае вам придется зацикливаться. Вероятно, легче всего убрать любого ведущего .*?XX перед повторной попыткой матча. В Perl Land вы бы использовали

while (/XX(.*?)YY(.*?)ZZ/) {
    print "[$1] [$2]\n";
    s/^.*?XX//;
}

Если вы отчаянно нуждаетесь в единственном регулярном выражении, то m//g в контексте массива придет вам на помощь. (Не уверен, как может выглядеть соответствующий php.)

@a = /XX(?=(.*?YY.*?ZZ))/g;

Массив @a будет содержать перекрывающиеся строки, но с удаленным начальным XX.

...