2011-07-07 12 views
1

私はTextmateのマクロを書き、数行のコードを1つのCSS行に変換しようとしています。だから、:正規表現:特定の文字まで空白と新しい行を一致させる

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

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

になるので、基本的に私は新しい行と空白と一致し、それが終わるところだ}に当たるまでただ一つの空間にそれらを有効にする必要があります。私は1つのブロックだけのCSSファイル全体を調べるつもりはありません。私は任意のヘルプをいただければ幸い正規表現で本当に悪いんだ

...パターンについて

答えて

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上で見ることができるように。

+0

OPのためのメモは、セレクタが複数の行にまたがる場合には機能しません。 – Qtax

+0

それは働いているようです。しかし、見つけたテキストをスペースで置き換えていくと、最終的にループの中に新しい行がなくなる場所になるように構造化することが可能です閉鎖} ...今はこれが起こったときにそれ以上の新しい行を見つけるべきではありません...私はそれが1つに含まれて欲しいです{ブロック} ...それはクローズドブラケットの前に新しいラインがないなら何かを見つけませんか?私はこれを複数のCSS行を1行にするキーストロークマクロとして実行する必要があります...一度に1ブロック、ありがとうBart –

+0

@Bart、私はあなたが何を意味するか分かりません。おそらく、この新しい要件でオリジナルの質問を編集することができますか? –

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 } 
+0

それは動作していないようだ...私は一致していない...おそらくtextmateはOniguruma正規表現ライブラリを使用します。私は構文が異なると思いますか? –

+0

@Bart:私が言ったように、これは最近のPCRE/Perlまたは互換バージョンでのみ動作します。正規表現エンジンは、これを動作させるために '\ K'をサポートする必要があります。これはリンク先のドキュメントでは見つかりませんでした。 – Qtax

0

実際にははるかに簡単な解決策があります。改行をスペースで置き換えるマクロを作るだけです。選択肢だけを実行しなければならないだろうが、最初はそれがあなたが望むすべてだと思う。

関連する問題