2012-03-26 3 views
0

Вопрос:

Как конвертировать var x+=1+2+3+(5+6+7) в var x += 1 + 2 + 3 + (5 + 6 + 7)Regex Отрицания в Vim

Детали:

Использование регулярных выражений, что-то вроде :%s/+/\ x\ /g не будет работать, потому что он будет конвертировать += в + = (среди другие проблемы). Поэтому вместо этого можно использовать отрицания (отрицательные, nots, все, что они называются), например :%s/\s\@!+/\ +/g, что примерно так же сложно, как можно сказать «знак плюс без пустого пространства перед ним». Но теперь это преобразует что-то вроде x++ в x + +. Мне нужно что-то более сложное. Мне нужно больше одного ограничения в отрицании и последующее ограничение. Что-то вроде этого, но это не работает :%s/[\s+]\@!+\x\@!/\ +/g

Может ли кто-нибудь предоставить одно или, возможно, два оператора регулярных выражений, которые выловят примерный оператор, чтобы я мог моделировать остальные мои правила на нем/им.

Мотивация:

Я нахожу beautifiers для таких языков, как Javascript или PHP не дают мне полный контроль (см here). Поэтому я пытаюсь использовать регулярное выражение для выполнения следующих преобразований:

  • foo(1,2,3,4)foo(1, 2, 3, 4)
  • var x=1*2*3var x = 1 * 2 * 3
  • var x=1%2%3var x = 1 % 2 % 3
  • var x=a&&b&&cvar x = a && b && c
  • var x=a&b&cvar x = a & b & c

Любая обратная связь также будет оценена

+0

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

+0

@MarcB Я думал о другом правиле для каждого оператора (т. Е. Для «+», один для '+ =' один для '-' ...), и я понимаю, что это не сработает для безумно сложных выражений типа' var x + = x +++++ y') – puk

+0

он хочет '\ w', я прав? – gaussblurinc

ответ

0

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

:%s/\(\w\)\([+\-*\/%|&~)=]\)/\1\ \2/g 
:%s/\([+\-*\/%|&~,(=]\)\(\w\)/\1\ \2/g 

И он работает достаточно хорошо. Вот некоторые результаты.

(1+2+3+4,1+2+3+4,1+2+3+4) --> (1 + 2 + 3 + 4, 1 + 2 + 3 + 4, 1 + 2 + 3 + 4) 
(1-2-3-4,1-2-3-4,1-2-3-4) --> (1 - 2 - 3 - 4, 1 - 2 - 3 - 4, 1 - 2 - 3 - 4) 
(1*2*3*4,1*2*3*4,1*2*3*4) --> (1 * 2 * 3 * 4, 1 * 2 * 3 * 4, 1 * 2 * 3 * 4) 
(1/2/3/4,1/2/3/4,1/2/3/4) --> (1/2/3/4, 1/2/3/4, 1/2/3/4) 
(1%2%3%4,1%2%3%4,1%2%3%4) --> (1 % 2 % 3 % 4, 1 % 2 % 3 % 4, 1 % 2 % 3 % 4) 
(1|2|3|4,1|2|3|4,1|2|3|4) --> (1 | 2 | 3 | 4, 1 | 2 | 3 | 4, 1 | 2 | 3 | 4) 
(1&2&3&4,1&2&3&4,1&2&3&4) --> (1 & 2 & 3 & 4, 1 & 2 & 3 & 4, 1 & 2 & 3 & 4) 
(1~2~3~4,1~2~3~4,1~2~3~4) --> (1 ~ 2 ~ 3 ~ 4, 1 ~ 2 ~ 3 ~ 4, 1 ~ 2 ~ 3 ~ 4) 
(1&&2&&3&&4,1&&2&&3&&4,1&&2&&3&&4) --> (1 && 2 && 3 && 4, 1 && 2 && 3 && 4, 1 && 2 && 3 && 4) 
(1||2||3||4,1||2||3||4,1||2||3||4) --> (1 || 2 || 3 || 4, 1 || 2 || 3 || 4, 1 || 2 || 3 || 4) 
var x=1+(2+(3+4*(965%(123/(456-789))))); --> var x = 1 +(2 +(3 + 4 *(965 %(123 /(456 - 789))))); 

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

+1

Вы можете попробовать для преодоления проблемы с помощью скобок с помощью команды подстановки ':% s/\ (\ w \ |) \) \ zs \ ze [+ \ - * \ /% | & ~) =] \ | [+ \ - * \ /% | & ~, (=] \ zs \ ze \ (\ w \ | (\)// g'. –

Смежные вопросы