Я использую расширение GDB для Visual Studio для отладки своих приложений на удаленном компьютере с Linux.
Проверьте: расширение
. Рабочая нагрузка Linux из установщика Visual Studio.
Регулярные выражения являются неправильным инструментом для задания, потому что Вы имеете дело с вложенными структурами, т.е. рекурсией.
, Но существует простой алгоритм, чтобы сделать это, которое я описал в этом ответе к предыдущий вопрос .
Ответ зависит от того, необходимо ли соответствовать соответствию наборам скобок или просто первому открытому для последнего завершения во входном тексте.
, Если необходимо соответствовать соответствию вложенным скобкам, затем Вам нужны что-то большее чем регулярные выражения. - видят @dehmann
, Если это просто первое открытый для длительности, близко видят , @Zach
Решает то, с чем Вы хотите произойти:
abc ( 123 ( foobar ) def ) xyz ) ghij
необходимо решить то, чему код должен соответствовать в этом случае.
(?<=\().*(?=\))
, Если Вы хотите выбрать текст между два соответствие круглые скобки, Вам не повезло с регулярными выражениями. Это невозможно <глоток> (*) глоток>.
Этот regex просто возвращает текст между первым открытием и последними закрывающими скобками в Вашей строке.
<час><глоток> (*) глоток>, Если Ваш regex механизм не имеет функции как балансирующаяся рекурсия групп или . Количество механизмов, которые поддерживают такие функции, медленно растет, но они все еще не обычно доступны.
[^\(]*(\(.*\))[^\)]*
[^\(]*
соответствия все, что не является открывающей скобкой в начале строки, (\(.*\))
получения необходимая подстрока, включенная в скобках, и [^\)]*
соответствия все, что не является закрывающей скобкой в конце строки. Обратите внимание, что это выражение не пытается соответствовать скобкам; простой синтаксический анализатор (см. ответ dehmann ) более подошел бы для этого.
потому что 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' } ]