正则表达式只匹配最里面的分隔序列

时间:2011-08-09 02:13:25

标签: regex perl delimiter lookahead

我有一个字符串,其中包含由多个字符分隔的序列:<<>>。我需要一个正则表达式才能给我最里面的序列。我已经尝试过前瞻,但它们似乎没有像我期望的那样工作。

这是一个测试字符串:

'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 个答案:

答案 0 :(得分:7)

@matches = $string =~ /(<<(?:(?!<<|>>).)*>>)/g;

(?:(?!PAT).)*是模式,[^CHAR]*是字符。

答案 1 :(得分:6)

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

答案 2 :(得分:0)

这是一种使用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;