2012-05-09 2 views
2

저는 전문가는 아니지만 .NET 정규 표현식을 작성하여 SQL 주석 행을 제외하려고합니다. 불행히도 제외 어 그룹을 사용하여 다른 정규 표현식에서 정규 표현식을 찾는 방법에 대한 적절한 설명을 찾을 수 없습니다 ('. *?'). 나는 그것을 시도C# .NET Regex : 예외가있는 그룹 식 작성에 대한 도움이 필요합니다.

'.*?' 

모든 작동하지 않는 내가 기대하고 같이 - (.. /*..*/와)

이 정규식은 따옴표 사이의 모든 텍스트를 발견뿐만 아니라 SQL 주석 영역을 포함 .

내 시험 샘플 :

'Cat' 
''Punto' 
and 
'But this should 
work here' 

답변

0

난 당신이 한 번에 원하는 것을 할 수있는 우아한 정규식을 찾을 수 없습니다,하지만 당신은 할 수 있습니다 :

IF @RetValue = 'Cat' 
    /*SET @RetValue = 'WrongLocation 
and it works here' */ 
    ------testing line 
SET @Dude = 'Punto' 
/* comments */ 
    -- But it doesn't work here because inside comments! 
    -- and this is aren't the end 
    SET @RetValue = 'But this should 
work here' 

올바른 일치 만이 반환해야 그것은 두 단계로 이루어집니다.

string commentFree = Regex.Replace(sourceString, @"\/\*.*?\*\/|\-\-[^\n]*\n", string.Empty, RegexOptions.Multiline | RegexOptions.Singleline); 

지금 당신은 당신의 분야를 추출 commentFree에 정규식 '[^']*'를 실행할 수 있습니다.

'[^']*'은 RegEx 엔진을 역 추적 할 필요가 없기 때문에 '.*?'보다 더 효율적입니다. 이제는 시작 인용문을 찾고, 인용문이 아닌 모든 문자에 대해 계속하고 끝 인용문으로 끝냅니다. 위의 기술을 사용하여 --의 줄 끝에서 \n 끝까지 주석을 가져옵니다.

편집 : 다른 방법으로, 당신은 (주석 내에 있지 않은) 모든 의견과 견적 블록을 일치하는 패턴 \/\*.*?\*\/|\-\-[^\n]*\n|'[^']*'을 사용할 수 있으며, 다음 만의 의지로, 그 결과를 반복 할 때 '로 시작하는 일치를 사용 견적 블록이되어야합니다.

+0

내가 제공 한 패턴이 예를 들어 예상대로 작동하지 않아서 여전히 데이터 처리가 더 필요하므로 주석을 공백으로 대체하는 데 어려움이 있습니다. 이것은 현재로서는 가장 좋은 해결책입니다. 지금은 더 나은 다른 패턴을 제공했고, 가지고있는 패턴에는 몇 가지 문제가 있습니다. – btomas

관련 문제