正则表达式:匹配空白和;新线直到特定字符

时间:2011-07-07 13:31:07

标签: regex macros textmate

我正在尝试为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 个答案:

答案 0 :(得分:3)

寻找模式:

\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上看到的那样

答案 1 :(得分:0)

如果您的工具支持更高版本的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 }

答案 2 :(得分:0)

实际上有一个更简单的解决方案。只需创建一个用空格替换换行符的宏。你必须只在选择上运行它,但我认为这就是你想要的一切。