Регулярное выражение для соответствия только самой внутренней последовательности - PullRequest
3 голосов
/ 09 августа 2011

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

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

'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 ]

8 голосов
/ 09 августа 2011
@matches = $string =~ /(<<(?:(?!<<|>>).)*>>)/g;

(?:(?!PAT).)* соответствует шаблонам, а [^CHAR]* - символам.

6 голосов
/ 09 августа 2011
$string = 'do not match this <<but match this>> not this <<BUT NOT THIS <<this too>> IT HAS CHILDREN>> <<and <also> this>>';
@matches = $string =~ /(<<(?:[^<>]+|<(?!<)|>(?!>))*>>)/g;
0 голосов
/ 09 августа 2011

Вот способ использования 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...