使用正则表达式进行拆分,在后面和前面使用负向外观以跳过块内部

时间:2014-04-04 16:53:05

标签: regex split lookahead negative-lookahead

给定一个字符串,我需要在正斜杠上拆分字符串,但前提是这些正斜杠不会出现在{}块中。

我知道这可以通过其他各种方式实现。在这一点上,我只是想看看这是否可能以及正则表达式是什么样的。如果功能正常,它可能会加快程序的速度。赢了。 :)

在以下示例中使用perl,尽管它最终可能以另一种语言实现。

这基本上就是我想做的事情:

#!/bin/perl -w
use strict;
use Data::Dumper;

my @strings = (
    "/this/that",
    "/this/", 
    "/this/{ID=/foo\/bar/}",
    "/this/{ID=foo/bar}",
    "/this/{/}",
    "/this/{ID=/foobar/}/that/foo/",
    "/this/{ID=f/o/o/b/a/r/}",
    "/this/{ID=/foobar/}/that/{bar}/that"
);


foreach my $string (@strings) {
    print $string."\n";

    my @items = split(/(?<!{.*?)\/(?!.*?})/,$string);

    print Dumper(\@items);

}

问题是你不能在后面使用可变长度的外观。

所以,我一直在玩只用前瞻来完成同样的事情。

我最接近的就是使用这一行进行拆分:

my @items = split(/\/(?![^{].*?}|})/,$string);

几乎得到它,但不会在{}块之前/之前分裂。所以我最终得到这样的结果:

$VAR1 = [
      '/this',
      '{ID=/foobar/}/that',
      '{bar}',
      'that'
    ];

应该是:

$VAR1 = [
      'this',
      '{ID=/foobar/}',
      'that',
      '{bar}',
      'that'
    ];

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以将当前的正则表达式更改为:

/(?![^{]*\})

如果前面没有/,它将匹配}

例如,如果匹配here,您将获得分组。

但是我觉得用比赛可能会更容易吗?

\{[^}]*\}|[^/]+

regex101 demo

现在,上面假设字符串中没有括号嵌套。