Perl регулярное выражение вопрос - PullRequest
1 голос
/ 16 июня 2010

Предположим, у меня есть переменные

$x1 = 'XX a b XX c d XX';
$x2 = 'XX a b XX c d XX e f XX';

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

Я пытался использовать /XX(.*?)XX/g, но это соответствует только «ab» для x1 и«ab», «ef» для x2, потому что как только первое совпадение найдено, движок уже прочитал второе «XX».

Спасибо за любую помощь.

Ответы [ 4 ]

8 голосов
/ 16 июня 2010

Попробуйте использовать позитивный прогноз :

/XX(.*?)(?=XX)/
3 голосов
/ 16 июня 2010

Я бы предложил разделить, а также knittl.Но вы также можете удалить пробелы:

my @stuff = split /\s*XX\s*/, $line;

Также вы могли бы использовать предвидения, но они вам действительно не нужны, поскольку вы также можете использовать достаточно сложные чередования:

Версия без ws будет просто:

my @stuff = $line =~ m/XX((?:[^X]|X[^X])*)/g; 

Чередование говорит, что вы возьмете что угодно, если это не 'X' - но вы получите 'X'если это не сопровождается другим 'X'.Будет один символ предпросмотра, но он может потреблять символы агрессивно, без возврата назад.

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

3 голосов
/ 16 июня 2010

вы можете использовать split

@stuff_between_xx = split /XX/, $x1;

количество совпадений:

$stuff_between_xx = split /XX/, $x1;
0 голосов
/ 16 июня 2010
my $x2 = 'XX a b XX c d XX e f XX';

my @parts = grep { $_ ne '' } split /\s*XX\s*/, $x2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...