우리는 더 많은 SQL 지향 프로젝트 중 하나에서 RoundhousE 마이그레이션 도구를 사용합니다. 나는 아주 이상한 버그Regex와 무한 루프
특정 SQL 함수 스크립트 정규식의 교체 방법은 결코 돌아 오지 수 (내 고객의 속성이 있기 때문에 슬프게도 나는 스크립트를 제공하지 못할)에 그루터기를 가지고있는 정규식이
과 같은
(?<KEEP1>^(?:[\s\t])*(?:-{2}).*$)|(?<KEEP1>/{1}\*{1}[\S\s]*?\*{1}/{1})|(?<KEEP1>'{1}(?:[^']|\n[^'])*?'{1})|(?<KEEP1>\s)(?<BATCHSPLITTER>GO)(?<KEEP2>\s)|(?<KEEP1>\s)(?<BATCHSPLITTER>GO)(?<KEEP2>$)
문제는 위임 evaluate_and_replace_batch_split_items
에없는
string sql_statement_scrubbed = regex_replace.Replace(sql_to_run, match => evaluate_and_replace_batch_split_items(match, regex_replace));
을 반환하지 RounhousE의 코드 라인 그것의 실제 regex.Replace 메서드에서, 나는 정규식 도구에서 정규식을 시도하고 그것도 중단됩니다. RegEx의 전문가 인이 사람이 문제가 무엇인지 확인할 수 있습니까?
편집 : 나는 그것이 작동하지만 -- If no previous, don't report revised
이 SQL 주석에서 ' (아포스트로피)을 제거하면 그뿐만 아니라 그 라인이
어떻게 든 인용 된 문자열의 시작으로 해석하고, 정규식은 "문자열"에 해당하는 끝나는 인용 부호를 찾기 위해 영원히 필요합니다. 내 정규식 (아래 참조)은 이러한 상황이 가져올 수있는 복잡성의 기하 급수적 인 증가에 덜 민감해야하지만 잘못된 텍스트와 여전히 일치 할 수 있습니다. 따라서 질문 : 여러 줄로 사용할 수 있습니까? 이자형. '''로 시작하고'''로 끝나지만 둘 사이에 개행 문자가 들어있는 문자열? –
이 주석을 놓쳤을 가능성이 있습니다. '이 synstax를 좋아하지 않습니다.'및 개행 문자가 있습니다. – Anders
본질적으로 잘못된 문자열 (아포스트로피로 구분 된 문자열에 이스케이프 처리되지 않은 아포스트로피가 없으므로)? 그런 다음 구문 분석 오류로 모든 언어 파서가 실패하는 것처럼 정규 표현식도 실패합니다. –