가장 큰 문제는 당신이 탈출 브래킷 (\[
) 또는 탈출 백 슬래시를 다음과 브라켓을보고하고 있는지 알고있다 (\\[
). 당신은 단지 하나의 일치를 찾고 있다면 그건 쉬운 충분 :
/^[^\]\[\\]*(?:\\.[^\]\[\\]*)*(\[[^\]\[]+\])/
첫 번째 부분은 백 슬래시 또는 괄호 이외의 문자를 먹는다. 백 슬래시가 있으면 그 문자와 그 다음 문자를 가져옵니다. 가능한 한 여러 번 해당 프로세스를 반복합니다. 더 이상 수행 할 수없는 경우, 다음은 찾고자하는 값 (또는 "태그")이어야합니다. 그룹 # 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);
}
백 슬래시를 두 번 이스케이프 처리하지 않으려면 정규식을 만들 때 왜 정규식을 사용하지 않습니까? '/\[.*\]/ g' – hugomg