2015-01-09 2 views
1

У меня есть это регулярное выражение (который почти работает):Regex добавить пробелы в математическое выражение (кабина +++ = 1 + 2 + 3 -> кабина ++ + = 1 + 2 + 3)

s/(?<!\+|-|)(\+|-)(?!=|\+|-|)/ $1 /g; 

https://regex101.com/r/oQ8qU8/2

И я хочу добавить пробел до и после каждого + и - char. Вот тест строка:

cab+=1+2+3+deb++-5+-5; 

Вывод должен быть:

cab += 1 + 2 + 3 + deb++ - 5 + -5; 

Я хотел бы, чтобы рассматривать все C/C++ особых случаев, таких как отрицательное число A=-C ->A = -C, в до/после приращение переменной A++=3 ->A++ = 3 ...

Есть ли хорошее решение для использования регулярного выражения здесь?

+2

's/([+ -])/$ 1/g'? –

+0

Это очень сложная вещь в целом. Например, как насчет 'C+++++ a + b +++ a', что означает' C++ + ++ a + b + ++ a'? – Borodin

+0

@Borodin Я медленно осознаю сложность своего вопроса :( – nowox

ответ

-1

Я написал саб для вас, так как эти регулярные выражения продолжали расти и расти ...

sub format{ 
     my $text = shift; 
     #substitute '+' 
     $text =~ s/(?<!\+)\+(?!\+|=)/ \+ /g; 
     #substitute '-'   
     $text =~ s/(?<!-)-(?!-|=|>)/ - /g; 
     #substitute '= , +=, -= (...)' 
     $text =~ s/([\+,-,\*,\/]?=)/ $1 /g; 

     #get rid of additional spaces: 
     $text =~ s///g; 
     return $text; 
} 

Вот некоторые результаты:

converting: foo+--bar++-3 += 3-x--+bar = ++c-*const->char++ +2 
to:   foo + --bar++ - 3 += 3 - x-- + bar = ++c - *const->char++ + 2 

converting: ++x->(a+b+--c) *= c++-++b/=9; 
to:   ++x->(a + b + --c) *= c++ - ++b /= 9; 

converting: b+c+a+d-=++*char->(--c+d); 
to:   b + c + a + d- = ++*char->(--c + d); 
+0

Правильно, но в этом случае я не могу иметь дело со специальными случаями типа 'ted +++ 2 + 3 + - i' ->' ted ++ + 2 + 3 + --i' – nowox

+1

Действительно. Пример выше немного запутанный tbh. Как ted-8 стал ted ++ - 8? То же самое с 'foo + bar' => 'foo + --bar'? –

+1

Моя ошибка, извините. Я обновил свой вопрос – nowox

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