Регулярное выражение для соответствия только самой внутренней последовательности
У меня есть строка, которая содержит последовательности, разделенные несколькими символами: <<
а также >>
, Мне нужно регулярное выражение, чтобы дать мне только самые внутренние последовательности. Я пробовал смотреть вперед, но, похоже, они не работают так, как я ожидаю.
Вот тестовая строка:
'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;