Vim Regex для сопоставления всех запятых в строке, которые не находятся в скобках - PullRequest
0 голосов
/ 14 марта 2020

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

\,(?![^[]*])

Это не работает со стилем регулярных выражений Vim и использованием Флаг \v, похоже, тоже не помогает.

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Вы можете сделать это, если удовлетворены два предположения:

  • нет вложенных скобок; и
  • скобки сбалансированы.

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 .

0 голосов
/ 14 марта 2020

Ответ связан со строками, заключенными в двойные кавычки, и одинарными кавычками.

execute "s/,\([^\[]*\]\)\@!/,\r/g"

Вышеприведенное не учитывает отрицательный прогноз, в то время как следующее будет:

execute 's/,\([^\[]*\]\)\@!/,\r/g'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...