2014-01-25 2 views
0

У меня есть строковый объект, возвращаемый API. Это выглядит следующим образом:Разделить строку ({a}, {b}) с помощью RegExp в Javascript

{Apple},{"A tree"},{Three2},{123},{A bracket {},{Two brackets {}},{} 

нужно только разделить на запятые, которые имеют } и { с обеих сторон, что я хочу, чтобы сохранить их как часть возвращенного результата. Выполнение split ("}, {") приводит к первым и последним записям, имеющим ведущие и конечные скобки, и когда возвращается только один элемент, я должен выполнить дополнительные проверки, чтобы гарантировать, что я не добавляю никаких дополнительных скобок для первого и последнего (которые аналогичны первым) элементам.

Надеюсь, что изящный RegExp будет разбит на ,, в окружении }{.

+1

Будет возникать проблема, если вход, подобный '{" Дерево}, {внутри}} ', появляется. – nhahtdh

+1

Мы тоже так надеемся. Удачи :) – Alexander

+3

Разве это не противоречие? Если это не так: {Apple}, {"Дерево"}, {Три2}, {123}, {{Скобка {}}, {Две скобки {}}}, {} –

ответ

1

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

var apiResponse = "{Apple},{\"A tree\"},{Three2},{123},{A bracket {},{Two brackets {}},{}"; 
var split = apiResponse.split(/,(?={)/); 
console.log("Split length is "+split.length); 
for(i = 0; i < split.length; ++i) { 
    console.log("split["+i+"] is: "+split[i]); 
} 

В (?=\{) средства «должны быть сразу после открывающей фигурной скобкой».

Чтобы ознакомиться с обзорами, см. this regex tutorial.

+2

-1. Look-behind не работает в JS – nhahtdh

+0

Вы были правы, @nhahtdh JavaScript не поддерживает lookbehind, поэтому я отредактировал свой ответ, чтобы он больше не зависел от lookbehind. Очень удивительно, что JavaScript по-прежнему не поддерживает эту устаревшую функцию регулярных выражений. – Bobulous

+0

Это решение по-прежнему имеет ту же проблему с '{" A Tree}, {inside "}'. – nhahtdh

0

Это должно работать для строки, как предусмотрено - она ​​не учитывает пробелы между фигурными скобками и запятыми, а также не сохраняет шаблон скобки-запятой внутри кавычек.

var str = '{Apple},{"A tree"},{Three2},{123},{A bracket {},{Two brackets {}},{}'; 
var parts = []; 

var nextIndex = function(str) { 
    return (str.search(/},{/) > -1) ? str.search(/},{/) + 1 : null; 
}; 

while (nextIndex(str)) { 
    parts.push(str.slice(0, nextIndex(str))); 
    str = str.slice(nextIndex(str) + 1); 
} 

parts.push(str); // Final piece 

console.log(parts); 
1
var _data = '{Apple},{"A tree"},{Three2},{123},{A bracket {},{Two brackets {}},{}'; 
var _items = []; 

var re = /(^|,){(.*?)}(?=,{|$)/g; 
var m; 
while ((m = re.exec(_data)) !== null){ 
    _items.push(m[2]); 
} 

Вы можете проверить его с помощью jsFiddle http://jsfiddle.net/wao20/SgFx7/24/

Regex разбивку:

  • (^ |,) Начало строки или запятой
  • { A l iteral скобка "{"
  • (. *?) нежадным матч между двумя скобами (для более информации http://javascript.info/tutorial/greedy-and-lazy)
  • } Буквальное кронштейн "}"
  • (? = { | $) Посмотрите вперед и не комментируя (совпадение с запятой), {"или конец строки ), не смотря вперед, он будет есть запятую, и вы получите только все остальные предметы.

Обновление: Изменено регулярное выражение для комментариев Робин.

/(^|,)\{(.*?)\}(?=,|$)/g to /(^|,){(.*?)}(?=,{|$)/g 
+1

Несколько комментариев: 1) вам не нужно скрывать '{', если за ним не следует ',' или число, и вам не нужно скрывать '}', если он не является частью '{n, m} '. 2) Это будет соответствовать '{foo {bar}, foobar, {hey}}' как '{foo {bar}' и ', {hey}'. – Robin

+0

Хорошая точка! спасибо за предложение. –

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