2010-12-13 3 views
1

Мне нужна помощь с запросом regex conundrum. Я все еще разбираюсь во всем этом - явно не эксперт!Сложное регулярное выражение для разбиения строки

Например. Скажем, у меня сложная строка так:

{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 массивы, содержащие:

Array1

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

array2

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

я добавил двойной слэш перед первой закрывающей фигурной скобкой, как способ сказать игнорировать это. Но не могу понять регулярное выражение, чтобы сделать это.

Может ли кто-нибудь помочь?

ответ

0

Найти все вхождения «string in braces» или «just string», затем перебрать найденные подстроки и разбить при столкновении.

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]); 
    } 
} 

это выражение будет, вероятно, лучше, чтобы справиться с сбежавших брекетами

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

Приветствие stereofrog. Мне нравится подход :) Это почти что я думаю. Кажется, что, когда вы сначала разделяете строку на массив «m», вы не игнорируете фигурные скобки, которым предшествует \\. Любой способ сделать это? – WastedSpace

+0

Измененная строка регулярного выражения отсутствует закрытие ")" – thirtydot

+0

Вы гений. Именно то, что я ищу :) Большое спасибо. С этим справлялся большой головокружение! – WastedSpace

Смежные вопросы