Regex: сопоставлять пробелы и новые строки до определенного символа - PullRequest
1 голос
/ 07 июля 2011

Я пытаюсь написать макрос для Textmate, чтобы взять несколько строк кода и превратить их в одну строку CSS.Итак:

#rules #footer ul { margin: 0 auto;
text-align: colorenter;
width: 700px;}

станет

#rules #footer ul { margin: 0 auto;text-align: colorenter;width: 700px;}

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

Я очень плохо разбираюсь в регулярных выражениях, любая помощь будет с благодарностью оценена ...

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

Найдите шаблон:

\s+(?=[^{}]*})

и замените его одним пробелом.

\s+ соответствует одному или нескольким символам пробела (пробел, табуляция, разрыв строки)только при взгляде в будущее } можно увидеть, не встречая { между ними.

Остерегайтесь, что это может пойти не так в таких случаях:

#rules #footer ul { margin: 0 auto;
text-align: colorenter;              /*    }     */
width: 700px;}

Небольшая демонстрация PHP:

<?php
$css = '#rules #footer ul { margin: 0 auto;



text-align: colorenter;



width: 700px;}

#rules #footer ul { margin: 0 auto;
text-align: colorenter;
width: 700px;}';

echo preg_replace('/\s+(?=[^{}]*})/', ' ', $css);
?>

напечатает:

#rules #footer ul { margin: 0 auto; text-align: colorenter; width: 700px;}

#rules #footer ul { margin: 0 auto; text-align: colorenter; width: 700px;}

, как вы можете видеть на Ideone .

0 голосов
/ 22 июля 2011

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

0 голосов
/ 07 июля 2011

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

(?:\S(?<!})|^)[ \t]*\K[\n\r]\s*, замененное пробелом.

Я написал это, чтобы удалить только разрывы строк и пробелы в начале строк.Вы можете использовать эквивалент s/(\s)\s+/$1/g для удаления всех двойных пробелов и в других местах.

Демонстрация Perl:

perl -E "$_=qq'foo,\noof {\n\tbar /* } */\n\tbaz\n}\nfoo{\nbaz\n}';say;s/(?:\S(?<!})|^)[ \t]*\K[\n\r]\s*/ /g;say"

Ввод:

foo,
oof {
        bar /* } */
        baz
}
foo{
baz
}

Результат:

foo, oof { bar /* } */ baz }
foo{ baz }
...