2015-08-31 221 views
0

這裏內部匹配的例子字符串,我有:正則表達式匹配所有``不 []

var sampleStr = "aaa[bbb=55,zzz=ddd],#ddd[ppp=33,kk=77,rr=fff],tt,ff"; 

我需要寫正則表達式,將匹配所有,字符,這是不是裏面[]

所以在我的示例字符串我應該接受下一,字符:

- `,` before `#ddd` 
    - `,` before `tt` 
    - `,` before `ff` 

,它應該忽略下一,

- `,` before `zzz` 
    - `,` before `kk` 
    - `,` before `rr` 

其實我不知道如何忽略那些,[...]。 大thx任何提前

+0

''aaa [bbb = 55,zzz = ddd],#ddd [ppp = 33,kk = 77,rr = fff],tt,ff「.split(i, ] *)] /)'或'「aaa [bbb = 55,zzz = ddd],#ddd [ppp = 33,kk = 77,rr = fff],tt,ff」.match(/ [^ \ [ \],] +(\ [[^ \ [\]] + \])?(=,|?$)/克)'。不過,兩者在邊緣情況下都很脆弱。 – nhahtdh

+0

謝謝!添加它作爲答案,我會批准它。 – Maris

回答

2

如果可以假設裏面[]的部分不包含嵌套[][]平衡:

var out = content.split(/,(?![^\[\]]*\])/); 

(?![^\[\]]*\])是負前瞻,檢查我們是不是裏面[]用啓發式。只要我們沒有遇到任何],因爲我們使用[]以外的字符,那麼我們不在[]之外。

上面的代碼將沿着括號[]以外的逗號,分割文本並返回令牌。

1

一種方法避免逗號括在方括號中首先匹配方括號。例如,用於置換:

var result = sampleStr.replace(/([^\[,]*(?:\[[^\]]*\][^\[,]*)*),/g, '$1#'); 

其他例如,如果要分割:

var result = sampleStr.match(/(?=[^,])[^\[,]*(?:\[[^\]]*\][^\[,]*)*/g); 

這些方法的優點是你不需要解析所有的字符,直到有一個超前結束爲每個逗號。

1

此正則表達式應該工作

,(?![^\[]*?\]) 

見:DEMO

說明

,是我們的目標逗號,

(?![^\[]*?\])使用負先行,以保證沒有]在012之後,這裏的一個技巧是使用.*而不是.*,我們使用[^\[]*來防止正則表達式匹配[...]而不是..]