Regex 正则表达式:匹配空白和;新行直到指定字符

Regex 正则表达式:匹配空白和;新行直到指定字符,regex,macros,textmate,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文件,只看一个块

我正试图为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文件,只看一个块

我真的不擅长正则表达式任何帮助都将不胜感激…

寻找模式:

\s+(?=[^{}]*})
并将其替换为单个空间

\s+
仅当向前看时才匹配一个或多个空格字符(空格、制表符、换行符)可以看到一个
{
而不会在它之间遇到一个
{

请注意,在这种情况下,这将出错:

#规则#页脚ul{边距:0自动;
文本对齐:colorenter;/*}*/
宽度: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;} #规则#页脚ul{边距:0自动;文本对齐:colorenter;宽度:700px;} #规则#页脚ul{边距:0自动;文本对齐:colorenter;宽度:700px;}
正如您在上所看到的。

如果您的工具支持更高版本的PCRE或类似工具,并且您希望它也能从选择器中删除换行符,那么您可以使用类似正则表达式的工具

(?:\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 }

实际上有一个简单得多的解决方案。只需制作一个宏,用空格替换换行符。您只需在选择项上运行它,但我认为这是您首先想要的。

请注意,这对分布在几行上的选择器不起作用。这似乎起作用。但是,是否可以构建我的结构在某种程度上,如果我一直用空格替换找到的文本…在循环中,它最终会到达一个地方,在结束}之前不再有新行…现在,当这种情况发生时,它不应该再找到任何新行…我希望它包含在一个{block}中…那么,有没有可能检查一下,如果在结束括号之前没有新行,是否找不到任何内容?我需要将此作为一个键笔划宏运行,该宏将获取多行css并将其转换为一行…一次一个块,谢谢Bart@Bart,我不知道你的意思。也许你可以用这个n来编辑你原来的问题ew要求?这似乎不起作用…我没有找到匹配项…据说textmate使用Oniguruma正则表达式库。我猜语法不同?这里有更多信息@Bart:正如我所说,这只适用于最新的PCRE/Perl或兼容版本。正则表达式引擎需要支持
\K
才能工作,我没有这样做在链接到的文档中查找。
foo, oof { bar /* } */ baz }
foo{ baz }