我有一个字符串,其中包含由多个字符分隔的序列:<<
和>>
。我需要一个正则表达式才能给我最里面的序列。我已经尝试过前瞻,但它们似乎没有像我期望的那样工作。
这是一个测试字符串:
'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
正如您在第三个结果中所看到的,我不能只使用/<<[^>]+>>/
因为字符串可能有一个分隔符,但不能连续两个。
我刚从试错中恢复过来。在我看来,这不应该是这么复杂。
答案 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;