Regex для замены двух текстов с использованием регулярного выражения в VIM - PullRequest
0 голосов
/ 27 мая 2020

Не эксперт по регулярным выражениям. Но после небольшого поиска в Интернете я придумал это выражение, чтобы поменять местами два текста в моем файле:

%s/(\s*\(&\)\(.*\), \(.*\)\s*);/( \3, \2 );/gc

Мой исходный текст:

read( &regVal.mAllBits, getAddr()+offset );

И я хочу заменить его на:

read( getAddr()+offset, regVal.mAllBits );

Как вы видите выше, требования:

  • игнорировать необязательные пробелы, которые встречаются между каждым текстом
  • Удалите символ & перед первым текстом.

У меня есть \ s * в начале и в конце, чтобы игнорировать пробелы. Но проблема в том, что пробел перед закрывающей скобкой в ​​операторе добавляется для соответствия 3. Таким образом, я получаю результат как:

read( getAddr()+offset , regVal.mAllBits );

Обратите внимание на лишний пробел перед ', '. Я так много пробовал, но не смог решить. Может ли кто-нибудь помочь мне игнорировать пробелы в сопоставлении с шаблоном в моем операторе регулярного выражения?

1 Ответ

1 голос
/ 27 мая 2020

Если вы не хотите сопоставлять пробелы, вы должны использовать \S, а не ., потому что . будет соответствовать любому символу , включая пробелы. Регулярные выражения по умолчанию всегда жадны, поэтому будут соответствовать как можно большему количеству совпадений.

%s/(\s*\(&\)\(.*\), \(\S*\)\s*);/( \3, \2 );/gc
...