给定一个字符串,我需要在正斜杠上拆分字符串,但前提是这些正斜杠不会出现在{}块中。
我知道这可以通过其他各种方式实现。在这一点上,我只是想看看这是否可能以及正则表达式是什么样的。如果功能正常,它可能会加快程序的速度。赢了。 :)
在以下示例中使用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'
];
提前致谢。
答案 0 :(得分:1)
您可以将当前的正则表达式更改为:
/(?![^{]*\})
如果前面没有/
,它将匹配}
。
例如,如果匹配here,您将获得分组。
但是我觉得用比赛可能会更容易吗?
\{[^}]*\}|[^/]+
现在,上面假设字符串中没有括号嵌套。