Регулярное выражение для соответствия сбалансированным круглым скобкам

Я использую расширение GDB для Visual Studio для отладки своих приложений на удаленном компьютере с Linux.

Проверьте: расширение

Для справки. См. Ссылку

. Рабочая нагрузка Linux из установщика Visual Studio.

264
задан Wiktor Stribiżew 7 March 2019 в 23:54
поделиться

5 ответов

Регулярные выражения являются неправильным инструментом для задания, потому что Вы имеете дело с вложенными структурами, т.е. рекурсией.

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

130
ответ дан Community 23 November 2019 в 02:29
поделиться

Ответ зависит от того, необходимо ли соответствовать соответствию наборам скобок или просто первому открытому для последнего завершения во входном тексте.

, Если необходимо соответствовать соответствию вложенным скобкам, затем Вам нужны что-то большее чем регулярные выражения. - видят @dehmann

, Если это просто первое открытый для длительности, близко видят , @Zach

Решает то, с чем Вы хотите произойти:

abc ( 123 ( foobar ) def ) xyz ) ghij

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

1
ответ дан Community 23 November 2019 в 02:29
поделиться
(?<=\().*(?=\))

, Если Вы хотите выбрать текст между два соответствие круглые скобки, Вам не повезло с регулярными выражениями. Это невозможно <глоток> (*) .

Этот regex просто возвращает текст между первым открытием и последними закрывающими скобками в Вашей строке.

<час>

<глоток> (*) , Если Ваш regex механизм не имеет функции как балансирующаяся рекурсия групп или . Количество механизмов, которые поддерживают такие функции, медленно растет, но они все еще не обычно доступны.

17
ответ дан Alan Moore 23 November 2019 в 02:29
поделиться
[^\(]*(\(.*\))[^\)]*

[^\(]* соответствия все, что не является открывающей скобкой в начале строки, (\(.*\)) получения необходимая подстрока, включенная в скобках, и [^\)]* соответствия все, что не является закрывающей скобкой в конце строки. Обратите внимание, что это выражение не пытается соответствовать скобкам; простой синтаксический анализатор (см. ответ dehmann ) более подошел бы для этого.

28
ответ дан Community 23 November 2019 в 02:29
поделиться

потому что js regex не поддерживает рекурсивное соответствие, я не могу сделать сбалансированные круглые скобки, соответствующие работе.

, таким образом, это - простой JavaScript для версии цикла, которые делают "метод (аргумент)" строка в массив

push(number) map(test(a(a()))) bass(wow, abc)
$(groups) filter({ type: 'ORGANIZATION', isDisabled: { $ne: true } }) pickBy(_id, type) map(test()) as(groups)
const parser = str => {
  let ops = []
  let method, arg
  let isMethod = true
  let open = []

  for (const char of str) {
    // skip whitespace
    if (char === ' ') continue

    // append method or arg string
    if (char !== '(' && char !== ')') {
      if (isMethod) {
        (method ? (method += char) : (method = char))
      } else {
        (arg ? (arg += char) : (arg = char))
      }
    }

    if (char === '(') {
      // nested parenthesis should be a part of arg
      if (!isMethod) arg += char
      isMethod = false
      open.push(char)
    } else if (char === ')') {
      open.pop()
      // check end of arg
      if (open.length < 1) {
        isMethod = true
        ops.push({ method, arg })
        method = arg = undefined
      } else {
        arg += char
      }
    }
  }

  return ops
}

// const test = parser(`$(groups) filter({ type: 'ORGANIZATION', isDisabled: { $ne: true } }) pickBy(_id, type) map(test()) as(groups)`)
const test = parser(`push(number) map(test(a(a()))) bass(wow, abc)`)

console.log(test)

, результат похож

[ { method: 'push', arg: 'number' },
  { method: 'map', arg: 'test(a(a()))' },
  { method: 'bass', arg: 'wow,abc' } ]
[ { method: '$', arg: 'groups' },
  { method: 'filter',
    arg: '{type:\'ORGANIZATION\',isDisabled:{$ne:true}}' },
  { method: 'pickBy', arg: '_id,type' },
  { method: 'map', arg: 'test()' },
  { method: 'as', arg: 'groups' } ]
0
ответ дан 23 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: