정규식 아님 연산자


109

Regexes에 NOT 연산자가 있습니까? 그 문자열에서와 같이 :"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

\([0-9a-zA-z _\.\-:]*\)연도가 아닌 모든 항목을 삭제하고 싶습니다 : (2001).

따라서 정규식이 반환해야하는 것은 다음과 같아야합니다 (2001) name..

참고 : 같은 \((?![\d]){4}[0-9a-zA-z _\.\-:]*\)것이 나를 위해 작동하지 않습니다 ( (20019)어떻게 든 일치합니다 ...).


1
위와 같은 문자열이 있으며 정규식의 결과는 다음과 같습니다 (2001) name.
Sonnenhut 2011 년

답변:


112

아니요, 직접 아님 연산자는 없습니다. 적어도 당신이 바라는 방식은 아닙니다.

그러나 너비가 0 인 부정 미리보기를 사용할 수 있습니다.

\((?!2001)[0-9a-zA-z _\.\-:]*\)

(?!...)텍스트가있는 경우 일부 수단 "은 일치 다음 이 : (내다 따라서) 하지 않는다 (따라서 : 음성).이 일치를하지만 실제로는하지 않습니다 소비 가 일치하는 문자 (따라서 : 제로 폭).

실제로 2 개의 축 이있는 4 개의 둘러보기 조합이 있습니다.

  • lookbehind는 내다 / : 지정 문자 경우 이전 또는 이후에 포인트가 고려된다
  • positive / negative : 문자 일치해야하는지 또는 일치 하지 않아야 하는지 지정합니다 .

감사합니다?! 내가 사용하는 경우 어쨌든하지만, 너무 제안 된 것입니다 \((?![\d]{4})[0-9a-zA-z _\.\-:]+\)여전히 존재 (20019)그 안에
Sonnenhut

귀하의 질문의 편집에서 당신은 넣어 {4} 외부에게 룩어 및이 댓글에 당신이 그것을 넣어 내부 : 당신은 어느 시도 했습니까? 또한 : (20019)매치를 원하신다 면 미리보기 \) 내부 를 추가해야합니다 :\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Joachim Sauer 2011 년

귀하의 의견에 위의 정규식을 사용하면 작동합니다. 근데 이해가 안 돼요 .. 왜 다음 부분을 벗어나는지 모르겠네요 \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)그럼 닫히지 않은 브래킷이 있지 않나요?
Sonnenhut 2011 년

나는 리터럴 문자 )와 일치하기를 원하기 때문에 닫는 괄호를 이스케이프합니다 (정규식의 맨 처음과 끝에서하는 것처럼!). 그런 다음 일치 시킨 후 이스케이프되지 않은 . ))
Joachim Sauer 2011 년

알았다. 나는 그 모든 캐릭터에 약간 혼란 스러웠습니다. 감사합니다.
Sonnenhut 2011 년

183

일반적으로 양식 중 하나에 대해 몇 가지 해결 방법을 사용할 수 있지만 정답은 아닙니다.

  • [^abc], a또는 b또는 또는 c,
  • 또는 부정적 미리보기 : a(?!b), a뒤에 나오지 않음b
  • 또는 음 lookbehind : (?<!a)b이다 b덧붙일하지a

- (?! <A) 참조 그래, 나는 부정적인 모습 숨김이 나 생각 regular-expressions.info/lookaround.html
jankins

8
그러나 "문자열이 아님"이 [^abc]아닌 a또는 b또는을 의미해야합니다 . cabc
비가 오는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.