复杂的正则表达式来分割字符串

时间:2010-12-13 12:37:47

标签: javascript regex string

我需要一些正则表达式难题的帮助。我仍然要掌握这一切 - 显然不是专家!

EG。假设我有一个如此复杂的字符串:

{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,但是因为我现在必须考虑在大括号内的管道,所以它会使事情变得复杂。

它尚未结束!然后我还需要通过大括号内的内容将每个字符串拆分成单独的部分而不是。所以我最终得到了两个包含:

的数组

数组1

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

Array2

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

我在第一个结束大括号之前添加了一个双斜杠作为一种说法忽略这个。但无法弄清楚正则表达式这样做。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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