1

私がやろうとしていることは本当に簡単だと感じていますが、感謝、ここで私が得たものの一例である:RegExで特定のプロパティと値を持つすべてのCSSセレクタに一致

.selector, .selector2 { 
    color: #fff; 
    background: #f4c13b; 
    opacity: 1; 
} 

.selector3:hover { 
    color: red; 
    opacity: 0; 
    background: #f4c13b; 
} 

#selector4.class { 
    background: #f4c13b; 
    color: red; 
} 

@media (min-width:320px) { 
    selector5 { 
    opacity: 1; 
    background: #f4c13b; 
    } 
} 

、私はbackground: #f4c13b;を持つすべてのセレクタに一致するようにしたいので、キャプチャグループを返します。.selector, .selector2.selector3:hover#selector4.classselector5を。ここで

は、私がこれまでに得たものである:何かが{前にそこにあるかのよう/(.*) {[\S\s][^background]*background: #f4c13b;/gm

は残念ながら、それだけで、最初のプロパティとしてbackground: #f4c13b;を持っているセレクタと一致し、background: #f4c13b;それがない試合:(

だろう

これの背後にある基本的な考え方は、すべてのセレクタが新しい行にあるので、{の前にすべてをキャプチャしてからbackground: #f4c13b;の前にすべてを選択してから}の前にすべてを選択して、第1の捕捉グループからのrs。

私は式をテストするためにregexr.comを使用していますが、私は彼らがのJavaScript風味のRegExを使用していると推測しています。少しの助けと説明は非常に、非常に感謝される、ありがとう!

+1

regexを使って具体的に解決策が必要ですか?あなたのユースケースは何ですか? CSS3のセレクタを理解し、CSSを圧縮して、すべてのセレクタを反復処理することで、CSSを完全に解析する方が簡単かもしれないと思います... –

+1

私はあなたが使用している言語を教えてください。 Java(またはJavaScript)では、パターンを繰り返し照合し、セレクタを何らかの種類のデータ構造に抽出します。 –

+1

ところで、 '[^ background]'は 'background'以外の文字列にマッチすることを意味しません。代わりに、 'b、a、c、k、g、r、o、u、n、d'以外の任意の_character_にマッチすると言います。 –

答えて

2

あなたは、この正規表現を使用することができます。/([.#]?[\w, .:]+?)(?= \{[^}]+?background: #f4c13b;[^}]+?\}\s*)/g

説明:アクションで

/        : regex delimiter 
    (       : start group 1 
     [.#]?     : optional dot or hash 
     [\w, .:]+?    : 1 or more alphanum, comma, space, dot, semicolumn, not greedy 
    )       : end group 1 
    (?=       : lookahead 
     \{      : open curly bracket 
     [^}]+     : 1 or more any char that is not close curly bracket 
     background: #f4c13b; : literally 
     [^}]+?     : 1 or more any char that is not close curly bracket, not greedy 
     \}      : close curly bracket 
     \s*      : 0 or more "spaces" including linebreak 
    )       : end lookahead 
/g        : regex delimiter, global flag 

var x = `.selector, .selector2 { 
 
    color: #fff; 
 
    background: #f4c13b; 
 
    opacity: 1; 
 
} 
 

 
.selector3 { 
 
    color: red; 
 
    opacity: 0; 
 
    background: #ffffff; 
 
} 
 

 
.selector3:hover { 
 
    color: red; 
 
    opacity: 0; 
 
    background: #f4c13b; 
 
} 
 

 
#selector4 { 
 
    color: red; 
 
    opacity: 0; 
 
    background: #f4c13b; 
 
} 
 

 
selector5 { 
 
    color: red; 
 
    opacity: 0; 
 
    background: #f4c13b; 
 
} 
 
@media (min-width:320px) { 
 
    selector6 { 
 
    opacity: 1; 
 
    background: #f4c13b; 
 
    } 
 
}`; 
 
var r = x.match(/([.#]?[\w, .:]+?)(?= \{[^}]+?background: #f4c13b;[^}]+?\}\s*)/g); 
 
console.log(r);

+0

ありがとうございます。ほとんどの場合、うまくいきましたが、セレクタが '#selector 'で始まったり、何もせずにdivで始まることがあるので、このコードはIDで失敗します。 html要素セレクタもう1つ、このコードは '@media {...'がある場合には失敗しますが、これらのケースを考慮してこのコードをもっと弾圧的にする可能性はありますか?もう一度おねがいします! – pbe

+0

@pbe:私のedit.Itは '.'、'# 'または何もない場合に動作します。 '@ media'については、"それ以前 "はどういう意味ですか?完全なテストケースで質問を編集してください – Toto

+0

はい、申し訳ありませんが、質問を更新しました、ありがとう! – pbe

関連する問題