2013-06-24 2 views
0

과 일치합니까? [.*]에 대한 모든 일치 항목을 얻는 방법은 무엇입니까? \[.*\]과 같이 대괄호가 백 슬래시 이스케이프 처리되어 있으면 어떻게 할 수 있습니까?정규식은 []은 아니지만 []

JavaScript 기능 new RegExp("\\[.*\\]", "g")을 사용하여 모두 [.*]을 사용할 수 있습니다. \[.*\] (이스케이프 처리 된 대괄호)을 모두 제외하려면 어떻게해야합니까?

입력은 다음과 같습니다 :이 경우

div\[data-custom-attribute='References'\][matchme] 

이, 정규식 [matchme] 일치해야합니다.

+1

백 슬래시를 두 번 이스케이프 처리하지 않으려면 정규식을 만들 때 왜 정규식을 사용하지 않습니까? '/\[.*\]/ g' – hugomg

답변

1

http://rubular.com/r/16q3jSPHN0

[^\\](?:\]?(\[(.+?)\]))은 대부분의 경우에 작동합니다.

편집 : 로리는 지적이, \[test\][test] 일치하지 않습니다처럼

보인다. 이를 위해, 난 정말 여러 regexps '에를 사용하지 않고 좋은 솔루션 생각할 수 없다, 그러나 당신이 원하는 경우 만 다음이 시도 : http://rubular.com/r/QBqFAbqW9E

(?:[^\\](?:\]?(\[(.+?)\]))|((?:\]?(\[(.+?)\])))\\)

일치 그룹이 먼저 채워집니다 3 대괄호가 이스케이프 처리 된 블록이 이후에 정규 블록이 발생하면 반대 3이 발생합니다.

Match 1 
1. 
2. 
3. [test] 
4. [test] 
5. test 
Match 2 
1. [test] 
2. test 
3. 
4. 
5. 
+1

JavaScript [지원하지 않습니다] (http://www.regular-expressions.info/javascript.html) [lookbehind] (http://www.regular-expressions.info /lookaround.html), 이것이 최선의 방법입니다. 그러나 자바 스크립트가 있다면'[^ \\]'을'(?

+0

@ RoryO'Kane 아하 네 말이 맞아. 적어도 JS에 관한 한 두 가지 표현을 사용하는 것이 현명 할 것이라고 생각합니다. 양자 택일로, 나는 두 경우를 잡을 것으로 보이는 단일 표현으로 내 주석을 업데이트했지만 이스케이프 된 블록의 위치에 따라 그룹화 된 결과를 대체합니다. 더 나은 해결책을 생각할 수 없다. – dav

+0

테스트 문자열에 백 슬래시가 포함되어 있지 않은 이유는 무엇입니까? 문자열의 단일 백 슬래시가 다음 문자를 이스케이프하므로 단일 백 슬래시가 실제로 문자열의 일부가 아니므로 데이터를 정확하게 테스트하지는 못합니다. 실제 예제에서 첫 번째 정규식은 작동하지 않습니다. http://jsfiddle.net/A6XBH/1/ – Ian

0

사용 [^\\] 같은 비 잡을 그룹 :

[^\\]\[.*[^\\]\] 
+2

당신이 찾고있는 문구가 * 캡쳐되지 않은 * 그룹이라고 생각합니다. 그러나 실제로 당신이 가지고있는 것은 사실상 부정 문자 클래스입니다. 문제를 해결하지 못합니다. 첫째로 정규 표현식은'['] 앞에 캐릭터를 소비해야하기 때문에 문자열 시작 부분에'[test]'와 일치하지 않을 것입니다. 당신은 부정적인 lookbehind에 대해서 생각하고 있을지도 모르지만, JavaScript는 그것을 지원하지 않습니다. –

+0

음 ... 전적으로 맞습니다. 그 정밀도 덕분입니다! – zessx

1

가장 큰 문제는 당신이 탈출 브래킷 (\[) 또는 탈출 백 슬래시를 다음과 브라켓을보고하고 있는지 알고있다 (\\[). 당신은 단지 하나의 일치를 찾고 있다면 그건 쉬운 충분 :

/^[^\]\[\\]*(?:\\.[^\]\[\\]*)*(\[[^\]\[]+\])/ 

첫 번째 부분은 백 슬래시 또는 괄호 이외의 문자를 먹는다. 백 슬래시가 있으면 그 문자와 그 다음 문자를 가져옵니다. 가능한 한 여러 번 해당 프로세스를 반복합니다. 더 이상 수행 할 수없는 경우, 다음은 찾고자하는 값 (또는 "태그")이어야합니다. 그룹 # 1에서 캡처되었습니다.

나머지 태그를 얻는 것이 더 까다 롭습니다. 데이터와 동기화 상태를 유지하려면 이전 일치 항목이 중단 된 위치에서 후속 일치 항목을 정확히 시작해야합니다. 많은 정규 표현식은 그 목적을 위해 \G 앵커를 지원하지만 도움이되지는 않습니다. JavaScript는 기본적으로 동일한 작업을 수행하는 /y 플래그를 채택하는 과정에 있지만 아직까지는 기대할 수 없습니다.

은 다음 경우에 작동합니다 해결 방법입니다 :

/(?:^|\[[^\]\[]+\])[^\]\[\\]*(?:\\.[^\]\[\\]*)*(?=(\[[^\]\[]+\]))/g 

핵심 정규식은 동일하지만 캡처 그룹은 내다 안에 지금이다. 처음에는 문자열의 앞 부분에서 일치를 시작하지만 첫 번째 태그 바로 앞에서 중지합니다.Lookahead는 태그가 인 것을 확인하고이를으로 확인하지만이를 소비하지 않습니다. 다음 경기는 태그를 다시 매치하는 것으로 시작하는데, 이번에는 그것을 소비합니다. 한편 태그는 그룹 # 1에서 캡처되므로 일반적인 방식으로 액세스 할 수 있습니다.

var regex = /(?:^|\[[^\]\[]+\])[^\]\[\\]*(?:\\.[^\]\[\\]*)*(?=(\[[^\]\[]+\]))/g; 
var match = regex.exec(subject); 
while (match != null) { 
    // tag is in match[1] 
    match = regex.exec(subject); 
}