2013-10-09 5 views
0

이 정규식에는 몇 가지 문제점이 있습니다.Spinning regex에 약간의 버그가 있습니다.

/\(\((((?>[^\(\(\)\)]+)|(?R))*)\)\)/x 

텍스트를 "스핀"하기 위해 사용됩니다. 우리가 "((우리는 (사랑 | like))이 셔츠 (size xl))")와 같은 문장을 가지고있을 때, 그는이 권리를 실행할 수 없다. 마지막 세 괄호 중 첫 번째 괄호가 텍스트 자체에 속하기 때문에 문장 끝에 세 개의 괄호가 있기 때문입니다.

작동 방법 : 처음에 3 개 이상이면 정규식에서 괄호를 처음으로 가져와야하며 마지막에 3 개 이상 괄호가있는 경우 마지막 2 개를 종료해야합니다. 가능한가요 ???

이제 다단계에서 매우 잘 작동하므로 "((this ((shirt | sweater)))))"와 같은 것은 "잘 작동합니다 (끝에 4 개의 괄호를 참조하십시오). 따라서 텍스트에 포함 된 괄호가 회전 괄호 바로 뒤에서 시작하거나 끝 괄호 바로 앞에서 끝나는 경우에만 잘못됩니다.

답변

1

음, 우선, 문자 클래스 내에서 괄호를 이스케이프 할 필요가 없으며 문자 클래스에 같은 문자를 두 번 이상 올리면 더 이상 유용하지 않습니다. 따라서 귀하의 정규식 기능의 변화없이 다음과 같이 될 수있다 : 당신이 원자 그룹을 사용하는 이유 완전히 확실하지 않다

\(\((((?>[^()]+)|(?R))*)\)\) 

중 하나; 나는 틀릴 수도 있고 (만약 내가 그렇다면 나를 바로 잡을 수도있다.) 표준적인 비 캡처 그룹을 사용하는 것보다 차이점을 찾지 못한다.

\(\(((?:[^()]|((?R))|(\((?:[^()]|(?3))*\)))*)\)\) 
    1   2  3 

캡처 그룹 :

이는 이제 정규식의 내부 캡처의 또 다른 가능성을 포함하여 정규식에서 중첩 된 단일 브래킷 문자열을 허용 할 수 있습니다 말했다
1 - 가장 바깥 쪽 사이의 첫 번째 큰 경기를 가져옵니다 ((...))
2 - 내부 일치를 가져오고 더 이상 중첩 됨 ((...))
3 -이 그룹에서도 재귀가 허용되도록 단일 괄호 사이에 내용을 가져옵니다. 필요없는 경우에는 배열에서 무시하십시오. 중첩 된 단일 괄호 만 허용됩니다.

regex101 demo

+0

당신은 내 영웅입니다! 마지막 정규 표현식 ('\ (\ ((?) [^()] | ((R)) | (\ ((?) [^()] | \) \)'), sharm처럼 작동합니다 !!!! –

+0

@ErikVandeVen 방금 도움을 주려고했습니다 ^^; 나는 그것이 당신을 위해 일해서 다행이다. :) – Jerry

관련 문제