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; 전 모든 것을 선택하고 } 전의 모든 것을 선택하여 selecto를 추출 할 수 있습니다. rs.

정규 표현식을 테스트하기 위해 regexr.com을 사용하고 있으며 자바 스크립트는 RegEx을 사용하고 있다고 생각합니다. 약간의 도움과 설명이 매우 감사 할 것입니다, 감사합니다!

당신이 정규식 사용할 수
+1

regex를 사용하여 특별히 솔루션이 필요합니까? 당신의 유스 케이스는 무엇입니까? CSS3 선택기를 이해할 수있는 CSS를 압축하고 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'로 시작하거나 심지어는 아무 것도하지 않고서도 시작할 수 있다는 질문을 던지면서 언급 했어야합니다. 따라서이 코드는 ID 및 HTML 요소 선택자. 한 가지 더,이 코드는'@media {...'가 있기 전에 실패 할 것입니다.이 코드를 그 사건을 고려하여 더 방탄하게 만들 가능성이 있습니까? 다시 한 번 고마워! – pbe

+0

@pbe : 편집을 참조하십시오. 그것은'.','#'또는 아무 것도 작동하지 않습니다. '@ media'의 경우, "before"로 무엇을 의미합니까? 완벽한 테스트 케이스로 질문을 수정하십시오. – Toto

+0

예, 죄송합니다. 감사합니다. – pbe