Регулярное выражение для соответствия только самой внутренней последовательности

У меня есть строка, которая содержит последовательности, разделенные несколькими символами: << а также >>, Мне нужно регулярное выражение, чтобы дать мне только самые внутренние последовательности. Я пробовал смотреть вперед, но, похоже, они не работают так, как я ожидаю.

Вот тестовая строка:

'do not match this <<but match this>> not this <<BUT NOT THIS <<this too>> IT HAS CHILDREN>> <<and <also> this>>'

Должен вернуться:

but match this
this too
and <also> this

Как вы можете видеть с третьим результатом, я не могу просто использовать /<<[^>]+>>/ потому что строка может иметь один символ разделителей, но не два подряд.

Я только что из проб и ошибок. Мне кажется, это не должно быть так сложно.

3 ответа

Решение
@matches = $string =~ /(<<(?:(?!<<|>>).)*>>)/g;

(?:(?!PAT).)* это шаблоны как [^CHAR]* это персонажам.

$string = 'do not match this <<but match this>> not this <<BUT NOT THIS <<this too>> IT HAS CHILDREN>> <<and <also> this>>';
@matches = $string =~ /(<<(?:[^<>]+|<(?!<)|>(?!>))*>>)/g;

Вот способ использования split для работы:

my $str = 'do not match this <<but match this>> not this <<BUT NOT THIS <<this too>> IT HAS CHILDREN>> <<and <also> this>>';
my @a = split /(?=<<)/, $str;
@a = map { split /(?<=>>)/, $_ } @a;

my @match = grep { /^<<.*?>>$/ } @a;

Сохраните теги там, если вы хотите их удалить, просто сделайте:

@match = map { s/^<<//; s/>>$//; $_ } @match;
Другие вопросы по тегам