Могу ли я написать это регулярное выражение за один шаг? - PullRequest
0 голосов
/ 07 апреля 2010

Это входная строка «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 // Соответствует '+', за которым следует любой символ не '' (пробел) или то же самое для '-'

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

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

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

Ответы [ 2 ]

6 голосов
/ 07 апреля 2010

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

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

на

" $1 "

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

3 голосов
/ 07 апреля 2010

Я бы попробовал

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