2017-10-30 2 views
0

이 코드가 있지만 모든 코드에 병목 현상이 있습니다. 효율성을 높이기 위해 이것을 다시 작성하는 방법에 대해 알고 싶습니다.정규식이 너무 느리게 실행됩니다.

Regex.Replace(text, @".+[a-zA-Z0-9]{17,500}.+(\r\n)", Environment.NewLine, RegexOptions.Compiled); 
+1

무엇을하려하십니까? 편집 : 또한, 귀하의 프로그래밍 언어는 무엇입니까? – bfontaine

+0

코드를 모두 표시 할 수 있습니까? – STF

+0

'텍스트 '란 무엇입니까? 일부 파일 내용? 한줄 한 줄씩 (또는 여러 줄 문자열을 사용하는 경우 줄 바꿈으로 구분),'Regex.IsMatch (줄, "[a-zA-Z0-9] {17500}")'로 각 줄을 확인하십시오. 일치하면 라인을 건너 뛰고, 그렇지 않으면 출력에 추가하십시오. 효율성에 대해 물어 보면, 게시물의 정규식만으로는 충분하지 않습니다. 자세한 내용을 입력하십시오. –

답변

1

.+[a-zA-Z0-9]{17,500}.+(\r\n) 패턴으로 인해 한 번에 전체 라인을 잡고 다음 17 (예, 17 개 문자를 체크하고 다음 정규식 엔진을 호출의 문자열을 수용하기 위해 백 트럭 처음 .+ 서브 패턴에 매우 비효율적이다 하루) 영숫자 문자. 이는 값 비싼 작업입니다.

접근 방식을 다시 고려해야합니다. Regex.Replace을 사용하는 대신 줄 바꿈으로 줄 바꿈 문자 (큰 줄 바꿈 문자열 인 경우)를 분할하거나 줄을 가져 오거나 파일에서 읽는 경우 한 줄씩 줄을 읽은 다음 각 줄 (항목 단지에 대한 간단한

Regex.IsMatch(line, "[a-zA-Z0-9]{17}") 

와 목록/배열 또는 선) 안에 17 개 연속 ASCII 영숫자 문자를 확인하거나 - 정말 17 500 같은 문자의 한계 부과 :

Regex.IsMatch(line, @"(?<![a-zA-Z0-9])[a-zA-Z0-9]{17,500}(?![a-zA-Z0-9])") 

하는 경우를 일치 항목이 발견되면 항목/행을 건너 뛰고, 그렇지 않으면 나중에 출력/결과 배열에 추가하여 나중에 string.Join("\n", resulting_list)이됩니다.

(?<![a-zA-Z0-9])은 앞의 문자가 ASCII 영숫자 문자가 아니고 (?![a-zA-Z0-9])이 다음 문자를 똑같이 검사하는지 확인합니다.

+0

성능 향상을 확인할 수 있습니다. 그것은 상대적인 50 %에서 1 %로 떨어진다. – realPro

관련 문제