2014-04-04 63 views
1

給定一個字符串,我需要在正斜槓上拆分字符串,但前提是斜槓不出現在{}塊中。使用正則表達式拆分,負面看後面和前面跳到塊內

我知道這可以通過各種其他方式完成。在這一點上,我只想看看這是否可能以及正則表達式的樣子。如果它功能強大,它可能會加快程序的速度。贏得勝利。 :)

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

您可以將當前的正則表達式更改爲:

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

它將匹配/如果沒有}在它前面的。

例如,如果有匹配項here,您將得到一個分割。

但我認爲這可能會更容易與一場比賽,而不是?

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

regex101 demo

現在,上面的假設沒有在字符串中括號的嵌套。

+0

你不需要逃避尾隨......但是是的。非常好。 我很接近...討厭被關閉,不得不問問:) 謝謝 – mbond

+0

@mbond如果他們不在字符類中,我通常會轉義元字符,所以正則表達式更加便攜,對不起^^ ;.別客氣! – Jerry

相關問題