Вы можете сделать это, если удовлетворены два предположения:
- нет вложенных скобок; и
- скобки сбалансированы.
ab,c[de[fg,h]i j]k,m
- пример строки с вложенными скобками. Учитывая первое предположение, второе означает, что за каждой левой скобкой следует правая скобка без левых скобок между ними, а каждой правой скобке предшествует левая скобка без правых скобок между ними. Это пример сбалансированных скобок:
ab[cd,ef]g,h[ij]k
Это примеры не вложенных несбалансированных скобок:
ab[cd
ab][cd
ab[cd]e]
Обратите внимание, что во втором примере скобки разбалансированы, даже если число левых скобок (1) равно количеству правых скобок. В третьем примере окончательному ']'
предшествует левая скобка, но между ними стоит ']'
.
Эти два предположения позволяют нам сопоставлять каждую запятую, за которой не следует правая скобка, которая не является предшествует левая скобка. Для этого мы можем использовать отрицательный взгляд, который содержит класс символов, который соответствует каждому символу, кроме левой скобки. С модулем регулярных выражений PCRE (PHP), который будет:
,(?![^[]*])
, мне достоверно сообщают (см. Комментарии), что в Vim это будет:
,\([^[]*]\)\@!
Отрицательные запросы поддерживается Vim и большинством других языков.
Демо
Регулярное выражение выполняет следующие операции:
, # match ','
(?! # begin negative lookahead
[^[]* # match 0+ characters other than '['
] # match ']'
) # end negative lookahead
Похоже, что одним из вариантов является использовать другой движок регулярных выражений в Vim. См. Например, это Q & A .