使用正则表达式拆分,负面看后面和前面跳到块内

问题描述:

给定一个字符串,我需要在正斜杠上拆分字符串,但前提是斜杠不出现在{}块中。使用正则表达式拆分,负面看后面和前面跳到块内

我知道这可以通过各种其他方式完成。在这一点上,我只想看看这是否可能以及正则表达式的样子。如果它功能强大,它可能会加快程序的速度。赢得胜利。 :)

在以下示例中使用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' 
    ]; 

感谢。

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

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

它将匹配/如果没有}在它前面的。

例如,如果有匹配项here,您将得到一个分割。

但我认为这可能会更容易与一场比赛,而不是?

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

regex101 demo

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

+0

你不需要逃避尾随......但是是的。非常好。 我很接近...讨厌被关闭,不得不问问:) 谢谢 – mbond

+0

@mbond如果他们不在字符类中,我通常会转义元字符,所以正则表达式更加便携,对不起^^ ;.别客气! – Jerry