Возьмите несколько совпадений с регулярным выражением, разделенным определенными отметками - PullRequest
0 голосов
/ 21 января 2009

У меня есть текст, и мне нужно взять содержимое в определенном порядке. Контент между MARK1 и MARK2 и контент после MARK2 . Тем не менее, эти отметки могут повторяться, и мне нужно принять все их вхождения. В приведенном ниже примере:

text: "textA textB _MARK1_ textC _MARK2_ textD _MARK1_ textE textF _MARK2_ textG textH textI"

array(0): _MARK1_ textC _MARK2_ textD 
array(1): textC
array(2): textD
array(3): _MARK1_ textE textF _MARK2_ textG textH textI 
array(4): textE textF
array(5): textG textH textI

Ответы [ 4 ]

1 голос
/ 21 января 2009

Это было бы:

/(_MARK1_(.*?)_MARK2_((?:(?!_MARK1_).)*))/g

По крайней мере, он работает на тренере RegEx в вашем тестовом примере.
Конечно, вам нужно повторять каждый матч.
Обратите внимание, что он может работать не во всех разновидностях регулярных выражений: в JavaScript, например, нет предварительных утверждений.

0 голосов
/ 21 января 2009

Я не уверен, действительно ли вам нужны разделительные метки в вашем массиве. Эта часть кажется излишней, если у вас нет конкретной спецификации для нее. Это решение предполагает, что вам это действительно не нужно. Поскольку вы не указали язык, как насчет Perl?

use Data::Dumper;
my $text = 'textA textB _MARK1_ textC _MARK2_ textD _MARK1_ textE textF _MARK2_ textG textH textI';
my @results = $text =~ m/(?<=_MARK1_|_MARK2_)(.*?)(?=_MARK1_|_MARK2_|$)/g;
print Data::Dumper::Dumper @results;

Однако нет смысла пробовать общий случай с регулярными выражениями. Вместо этого используйте парсер.

0 голосов
/ 21 января 2009

Я что-то упустил или это то, что вы ищете?

/(_MARK1_ (.*?) _MARK2 (.*?))*/

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

0 голосов
/ 21 января 2009

Я не думаю, что вы сможете достичь этого одним выражением. Скорее всего, вам нужно разбить его на начальное выражение, а затем цикл, чтобы выполнить сопоставление 2-го выражения с каждой итерацией первого совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...