2016-09-14 1 views
0

패턴이 일치하고 그룹 끝나기 전에 특정 단어가없는 경우에만 캡처 그룹을 허용하려고합니다. 나는 접근 방법 #을 시도하고 아무도 명확하게 내가 개념받지 못했습니다, 제대로 작동하지 :문자열 끝의 부정적인 어설 션 수정

에 관계없이 내 캡처 그룹이 뭔가를 포착하는 일의 https://regex101.com/r/iP2xY0/3 https://regex101.com/r/iP2xY0/4

내 목표는 경우입니다 일치하지 않는 단어를 패턴 중간에 제거합니다.

RC:\*.*?(?P<Capture>(Bob|David|Ted|Alice))(?!Reject).* 
  • RC : * 안녕 밥 스미스 < \ 사람>
  • RC : * 안녕하세요 데이비드 존스 (David Jones) * 참고 즐 즐 < \ 사람>
  • RC : * 안녕하세요 테드 워렌 * 사람 \ < 거부 >는

캡처 Namegrouop는 반환하도록되어 :

  • 데이비드
  • ''

그래서 "거부"를 NameGroup 캡처가 < 캡처 끝나는 것도 다음에 발견되는 경우라고 그것의 NameGroup과 < Reject 나타납니다 할 단어 사이의 경우 아니.

+0

https://regex101.com을/r/iP2xY0/5는 거부에만 일치합니다. –

+0

@be_good_do_good 감사합니다. 그러나 내가 찾고있는 것은 String1의 'Bob', String2의 David 및 String3의 문자열과 일치하는 것입니다. – user3649739

답변

0

패턴의 시작 부분에 네가티브 미리보기를 넣는 것이 좋습니다. 당신이 거절 경우는 먼저 단어는 문자열에 존재하고 문자열의 나머지 부분과 일치하도록이 시도 않습니다되지 않은 경우에만 :

(?!.*Rejected.*)RC:\*.*?(?P<Capture>(Bob|David|Ted|Alice)).*

https://regex101.com/r/iP2xY0/6

+0

실제로 작동합니다. "negative look-ahead"라고 생각합니다. :). 저는 그것이 실제로 옳았 기 때문에 대답을 받아 들였습니다. 그러나 나는 Timeouts와 함께이 문제를 사용하고 있습니다. 두 개의 '파이프'가 있습니다. 첫 번째 파이프의 캡처 그룹은 용어가 표시되지 않는 경우 사용하고 두 번째 파이프의 경우 사용합니다. https://regex101.com/r/bU6cU6/1, 네가 미리보기 위해 솔루션 사용 첫 번째 파이프를 검증합니다. 그러나 neg 구문은 실제로 약 3k 문자를 텍스트에 포함하고 있으며 시간 초과가 발생합니다 https://regex101.com/r/bU6cU6/2 그 방법이 있습니까 아니면 그냥 nega lookahead의 기능입니까? – user3649739

+0

타임 아웃의 이상한 점은 첫 번째 파이프가 작동하지 않는다는 것을 알아내는 데는 32 단계가 필요하다는 것입니다. 두 번째 파이프가 작동한다는 것을 알아내는 18 단계는 자신의 작업입니다. 그래서 Regex이 그것을하고 있는지 확신 할 수 없다. 해야하지) 첫 번째 파이프, 32 단계, 거부, 두 번째 파이프로 이동, 18 단계 받아 들여야하지 않아? – user3649739

+1

불필요한 역 추적을 줄이기 위해'RC :'다음에 미리보기를 넣으십시오. –