내 정규 표현식이 너무 많이 일치합니다.멈추게 하려면 어떻게 해야 하나요?

StackOverflow https://stackoverflow.com/questions/22444

  •  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

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

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

이것은 당신에게 도움이 될 것입니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top