Комплексное регулярное выражение для разделения строки - PullRequest
1 голос
/ 13 декабря 2010

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

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

{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\\}(.)}

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

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 13 декабря 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...