2013-11-25 7 views
2

따옴표 붙은 문자열과 이스케이프 된 따옴표의 일치에 대해 한 번만 answered a question했습니다.정규식 일치가 완료되지 않았습니다.

그것은 예를 들어, (OutOfMemoryException와) 모노에 .NET 및 충돌에 걸 경우가있는 것 같습니다 :

var reg = new Regex(@"^""([^\\""]*(\\"")*(\\[^""])*)*"""); 
reg.Match("\"        "); 

두 질문 :

1) 왜 이런 일이 않는가?

2)이 정규식을 향상시키는 방법은 무엇입니까? 모든 "기능"을 보존하고 싶습니다.

+2

이것은 아마도 [치명적인 백 트랙킹] (http://www.regular-expressions.info/catastrophic)의 사례 일 수 있습니다. html). 연결된 질문에 더 좋은 대답이 있습니다. –

+0

FYI, Javascript의 Regex 엔진을 사용하여 표현식을 사용할 수 있습니다. http://www.rexfiddle.net/slfowcR – qJake

+0

그냥 아이디어 - 왜 정규식을 사용하여 실제로해야합니까? 문자열을 구문 분석하기 위해 간단한 상태 시스템을 작성하는 것이 더 쉽지 않을까요? 당신은 당신이 제공 한 것과 같은 경우에 기하 급수적으로 비싸게 만드는 모든 역겨운 백 트랙을 해결할 것입니다. – Luaan

답변

0

실제로 패턴의이 부분을 사용하여 치명적인 백 트랙킹을 수행합니다 ((\\[^""])*)*). 이는 전 세계에서 가능한 모든 것을 허용하고 정규식 엔진이 너무 많은 가능성을 시도하도록합니다. (당신이 팀 S. 링크를 따르는 경우에 더 나은 그림은 찾을 수 있습니다)

이 수행하려는 다른 패턴 : 교대의

var reg = new Regex(@"(?s)""(?>[^\\""]+|\\{2}|\\.)*"""); 

(아이디어는 백 슬래시 의 모든 짝수 번호와 일치하는 것입니다 (두 번째 부분을) 실제 탈출 문자를 허용하기 전에 (대체 부분의 세 번째 부분).

+0

정규식에 짝수 개의 백 슬래시가 없다고 생각합니다. 이스케이프 처리되지 않은 따옴표 사이에 모든 내용을 잡아야합니다. 확신하기에는 다소 과도합니다. Tim S.이 주석 만 제공 했으므로 답변을 수락 할 것입니다. 감사합니다. –

+0

@PiotrZierhoffer : 원하는 내용을 추출하기 위해 캡처 괄호를 추가해야합니다 (또는 몇 개의 lookbehind/lookahead 사용 큰 따옴표를 묶으십시오). 짝수 개의 역 슬래시에 대해서는 다음과 같은 문자열을 고려하십시오. 'abc "def" "g \"hi ""jkl \\ ""mn \\\ "o"'. 결과는'def','g "hi','jkl \\','mn \"o'이어야합니다. –

관련 문제