development

내 정규식이 너무 많이 일치합니다.

big-blog 2020. 10. 19. 08:16
반응형

내 정규식이 너무 많이 일치합니다. 중지하려면 어떻게해야합니까?


J0000000: Transaction A0001401 started on 8/22/2008 9:49:29 AM
J0000010: Project name: E:\foo.pf
J0000011: Job name: MBiek Direct Mail Test
J0000020: Document 1 - Completed successfully

이 거대한 못생긴 문자열이 있고 정규식을 사용하여 조각을 추출하려고합니다.

이 경우 "J0000011 :"(11은 매번 다른 숫자가 될 것임) 부분까지 "Project Name"뒤의 모든 것을 가져오고 싶습니다.

여기 내가 가지고 놀던 정규식이 있습니다.

Project name:\s+(.*)\s+J[0-9]{7}:

문제는 마지막에 J0000020에 도달 할 때까지 멈추지 않는다는 것 입니다.

J [0-9] {7} 의 첫 번째 발생에서 정규식을 중지하려면 어떻게해야 합니까?


뒤에 .*' ?' 를 추가하여 탐욕스럽지 않게 만드십시오 .

Project name:\s+(.*?)\s+J[0-9]{7}:

탐욕스럽지 않은 수량자를 사용하는 것이 아마도 탐욕스러운 대안보다 더 효율적이기 때문에 아마도 최선의 해결책 일 것입니다 : 탐욕스러운 일치는 일반적으로 가능한 한 멀리 가고 (여기서는 텍스트 끝까지!) 그리고 문자 뒤의 문자를 추적합니다. 나중에 오는 부분을 시도하고 일치시킵니다.

그러나 대신 음수 문자 클래스를 사용하는 것이 좋습니다.

Project name:\s+(\S*)\s+J[0-9]{7}:

\S "공백을 제외한 모든 것을 의미하며 이것이 바로 당신이 원하는 것입니다.


음, ".*"탐욕스러운 선택자입니다. ".*?"후자의 구조 를 사용할 때 정규식 엔진은 모든 단계에서 텍스트 "."를 일치시켜 ".*?". 이것은 예를 들어 뒤에 ".*?"아무것도 나오지 않으면 아무것도 일치하지 않는다는 것을 의미합니다 .

여기에 제가 사용한 것이 있습니다. s원래 문자열을 포함합니다. 이 코드는 .NET 전용이지만 대부분의 정규식 유형에는 비슷한 것이 있습니다.

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;

또한 "Expresso"를 사용하여 정규식을 실험 해 볼 것을 권장합니다. 정규식 편집 및 테스트를위한 훌륭한 (그리고 무료) 유틸리티 인 유틸리티입니다.

장점 중 하나는 UI가 정규식에 익숙하지 않은 사람들이 익숙하지 않을 수있는 많은 정규식 기능을 노출하여 이러한 새로운 개념을 쉽게 배울 수 있다는 것입니다.

예를 들어 UI를 사용하여 정규식을 빌드하고 "*"를 선택하면 "최대한 적게"확인란을 선택하고 결과 정규식을 볼 수있을뿐만 아니라 익숙하지 않은 경우에도 동작을 테스트 할 수 있습니다. 욕심이없는 표현.

해당 사이트에서 다운로드 가능 : http://www.ultrapico.com/Expresso.htm

빠른 다운로드 : http://www.ultrapico.com/ExpressoDownload.htm


(프로젝트 이름 : \ s + [AZ] : (? : \\ w +) +. [a-zA-Z] + \ s + J [0-9] {7}) (? = :)

이것은 당신을 위해 작동합니다.

(? : \\ w +) +. [a-zA-Z] + 추가는. * 대신 더 제한적입니다.

참고 URL : https://stackoverflow.com/questions/22444/my-regex-is-matching-too-much-how-do-i-make-it-stop

반응형