2010-12-13 135 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

相关问题