2015-06-05 4 views
0

В Javascript Я хочу получить строку, представляющую весь текст между двумя круглыми скобками, даже если эта строка содержит больше круглых скобок.Получить текст между круглыми скобками

Она будет работать следующим образом:.

"(а) (б) (в)" матч (ТО);

[ "а", "б", "в"]

ИЛИ

"а"

«((а) (б) (c)) ". match (SOMETHING);

"(а) (б) (в)"

+1

А что вы пытались до сих пор? –

+0

/\ (([^)] +) \)/- но он возвращает ["((a)", "(a"] для строки "((a) (b) (c))" – JOster

+2

I ' m довольно уверен, что такой язык не является регулярным, потому что для механизма распознавания потребуется стек (или иным образом использовать непостоянный объем памяти). Регулярное выражение вряд ли будет правильным инструментом для задания. – apsillers

ответ

1

Это должно сделать трюк:

(?:\()[^\(\)]*?(?:\)) 

Как это работает

  • \( соответствует открывающим скобкам
  • \) спички закрытия скобки
  • [^\(\)] соответствует ничего, кроме более скобок
  • *? добавить ноль или более раз квантор к вышеуказанному шаблону (сделанный ленивы ?)

реализации JavaScript

Попытка:

your_string.match(/(?:\()[^\(\)]*?(?:\))/g) 
+0

"((a) (b) (c))". (/ \ ([^ \ (\)] *?\) /), но он возвращает ["(a)"] – JOster

+0

Не беспокойтесь объяснять, не работает (Попробуйте '((a) b (c))') – Amit

+0

Не работает, но спасибо за regex информация. – JOster

0

Вам все равно, соответствуют ли паренс? Если вам нужно будет использовать стек, вы не можете делать это с помощью регулярных выражений.

попробовать что-то вроде этого:

var str = "aaa((0)12(2))bbb"; 
 
var stack = []; 
 
var result =""; 
 
var start = false; 
 

 
for (var i = 0; i < str.length; i++) { 
 
    switch (str[i]) { 
 
    case '(': 
 
     stack.push('('); 
 
     if (!start) { 
 
     start = true; 
 
     continue; 
 
     } 
 
     result += str[i]; 
 
    break; 
 
    case ')': 
 
     if (stack[stack.length - 1] === '(') { 
 
     stack.pop(); 
 
     if (stack.length === 0) { 
 
      start = false; 
 
      continue; 
 
     } 
 
     result += str[i]; 
 
     } else { 
 
     //not balanced! 
 
     } 
 
     
 
    break; 
 
    default: 
 
     if (start){ 
 
     result += str[i]; 
 
     } 
 
    } 
 
} 
 

 
console.log(result);

+0

В моем сценарии parens всегда будут совпадать. Спасибо, этот ответ прочен. – JOster

+0

Так что мой вопрос на самом деле попросил текст ** внутри ** скобки. Поэтому я немного изменил ваш код. – JOster

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