2010-12-13 184 views
1

我需要一些正則表達式疑難解答的幫助。我仍然在掌握這一切 - 顯然不是專家!複雜的正則表達式來分割一個字符串

例如,說我有一個複雜的字符串,像這樣:

{something:here}{examp.le:!/?foo|bar}BLAH|{something/else:here}:{and:here\\}(.)} 

首先我要使用管道分割字符串到一個數組的,所以它實際上是這樣的:

{something:here}{examp.le:!/?foo|bar}BLAH 

{something/else:here}:{and:here\\}(.)} 

但請注意,大括號內有一個管道可以忽略...因此需要爲此計算正則表達式。我最初使用的是indexOf,但是因爲我現在必須考慮大括號內的管道,這使事情變得複雜。

而且還沒有結束!然後,我還需要將每個字符串拆分成大括號內的不同部分,而不是。所以我最終用含2個數組:

數組1

{something:here} 
{examp.le:!/?foo|bar} 
BLAH 

ARRAY2

{something/else:here} 
: 
{and:here\\}(.)} 

我增加所述第一閉合花括號前的雙斜線的話說到的一種方式忽略這一個。但無法弄清楚正則表達式來做到這一點。

任何人都可以幫忙嗎?

回答

0

查找「大括號中的字符串」或「只是字符串」的所有匹配項,然後遍歷找到的子字符串並在遇到管道時進行拆分。

str = "{something:here}{examp.le:!/?foo|bar}BLAH|{something/else:here}:{and:here\\}(.)}" 

var m = str.match(/{.+?}|[^{}]+/g) 
var r = [[]]; 
var n = 0; 
for(var i = 0; i < m.length; i++) { 
    var s = m[i]; 
    if(s.charAt(0) == "{" || s.indexOf("|") < 0) 
     r[n].push(s); 
    else { 
     s = s.split("|"); 
     if(s[0].length) r[n].push(s[0]); 
     r[++n] = []; 
     if(s[1].length) r[n].push(s[1]); 
    } 
} 

這EXPR很可能是更好地處理逃脫括號

var m = str.match(/{?(\\.|[^{}])+}?/g 
+0

乾杯stereofrog。我喜歡這個方法:)我認爲它幾乎就在那裏。看起來,雖然最初將字符串拆分爲「m」數組,但您並不會忽略以\ \開頭的花括號。任何方式來做到這一點? – WastedSpace 2010-12-13 14:23:07

+0

已更改的正則表達式行丟失關閉「)」 – thirtydot 2010-12-13 14:43:50

+0

你是一個天才伴侶。正是我在找什麼:)非常感謝。用這個做了很多頭撓! – WastedSpace 2010-12-13 14:49:39

相關問題