내 정규 표현식이 너무 많이 일치합니다.멈추게 하려면 어떻게 해야 하나요?
-
09-06-2019 - |
문제
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
나는 이 거대하고 못생긴 문자열을 가지고 있고 정규 표현식을 사용하여 그 문자열에서 조각을 추출하려고 합니다.
이 경우 "Project Name" 이후의 "J0000011:" 부분까지 모든 것을 가져오고 싶습니다(11은 매번 다른 숫자가 됩니다).
내가 가지고 놀았던 정규식은 다음과 같습니다.
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
(프로젝트 이름:\s+[A-Z]:(?:\\w+)+.[a-zA-Z]+\s+J[0-9]{7})(?=:)
이것은 당신에게 도움이 될 것입니다.
(?:\\w+)+.[a-zA-Z]+를 추가하면 .* 대신 더 제한적입니다.