2010-04-07 4 views
0

Это входная строка «23x + y-34 x + y + 21x - 3y2-3x-y + 2». Я хочу окружить все символы «+» и «-» пробелами, но только если они не имеют слишком много окружения с левой или с правой стороны. Таким образом, моя строка ввода будет выглядеть так: «23x + y - 34 x + y + 21x - 3y2 - 3x - y + 2». Я написал этот код, который делает работу:Могу ли я написать это регулярное выражение за один шаг?

Regex reg1 = new Regex(@"\+(?!)|\-(?!)"); 
    input = reg1.Replace(input, delegate(Match m) { return m.Value + " "; }); 
    Regex reg2 = new Regex(@"(?<!)\+|(?<!)\-"); 
    input = reg2.Replace(input, delegate(Match m) { return " " + m.Value; }); 

объяснение: REG1 // Match '+', а затем любой символ, не '' (пробельных) или то же самое для '-'

Reg2 // То же самое только что я матч «+» или «-» не предшествующее от ' «(пробел)

делегатом 1 и 2 просто вставить„“до и после m.Value (значение матча)

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

ответ

6

Я не вижу необходимости поиска или делегатов здесь. Просто замените

\s*([-+])\s* 

с

" $1 " 

(см http://ideone.com/r3Oog.)

+0

Хороший сайт, ideone.com! –

+0

thx, я новичок в регулярном выражении, не знал, что это может быть так просто – dontoo

3

Я хотел бы попробовать

Regex.Replace(input, @"\s*[+-]\s*", m => " " + m.ToString().Trim() + " "); 
+0

Лямбда-выражения - это весело, но это можно сделать только с помощью регулярных выражений, как продемонстрировал @KennyTM. –

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