전체 정규식을 부정하는 방법은 무엇입니까?


95

예를 들어 정규식이 있습니다 (ma|(t){1}). 일치 ma하고 일치 t하지 않습니다 bla.

나는 정규 표현식을 부정하는 것이이 일치해야합니다 bla하지 mat, 이 정규식에 뭔가를 추가하여 . 나는 쓸 수 있다는 것을 알고 bla있지만 실제 정규식은 더 복잡합니다.


5
제쳐두고 {1}완전히 쓸모가 없습니다. (당신이 그것이 어떤 가치를 제공한다고 생각한다면, 왜 쓰지 ((m{1}a{1}){1}|(t){1}){1}않습니까?)
tripleee

답변:


100

부정적인 둘러보기 사용 : (?!pattern)

긍정적 인 룩 어라운드를 사용하여 패턴이 일치하는지 확인할 수 있습니다. 부정적 룩 어라운드는 그 반대입니다. 패턴이 일치하지 않는다고 주장하는 데 사용됩니다. 어떤 맛은 단언을 지원합니다. 일부는 lookbehind 등에 제한을 둡니다.

regular-expressions.info에 대한 링크

또한보십시오

더 많은 예

이것들은 장난감 문제에 대한 정규식 솔루션을 연습으로 제시하려는 시도입니다. 둘러보기를 사용할 수있는 다양한 방법 (중첩, 캡처에 사용 등)을 배우려는 경우 교육적이어야합니다.


2
regular-expressions.info는 모든 정규 표현식에 대한 훌륭한 리소스입니다.
Freiheit

모두 둘러보기 지원이 있습니까? 에서 작동하지 않습니다 grep.
Lazer

Pattern.compile("(?!(a.*b))").matcher("xab").matches()이어야합니다 true.
Karl Richter

4
나는 이것이 옳지 않은 것 같습니다 . 올바른 대안 은 stackoverflow.com/questions/8610743/… 을 참조하십시오 .
Karl Richter

56

정규식과 완전히 일치하는 문자열 만 허용하지 않는다고 가정하면 (즉, mmbla괜찮지 만 mm그렇지 않습니다) 원하는 것은 다음과 같습니다.

^(?!(?:m{2}|t)$).*$

(?!(?:m{2}|t)$)부정적 예측입니다 . 그것은 "다음 몇 문자입니다 현재 위치로부터 개시라고 하지 mmt, 문자열의 끝 하였다." 시작 ^부분 의 시작 앵커 ( )는 문자열의 시작 부분에 미리보기가 적용되도록합니다. 성공하면는 .*계속 진행하여 문자열을 소비합니다.

참고로 Java의 matches()방법을 사용 하는 경우 the ^및 final이 실제로 필요 $하지는 않지만 해를 끼치 지 않습니다. 그러나 $내부 예측이 필요합니다.


2
이 답변의 가장 유용한 부분은 .*정규식 끝에 추가 해야한다는 것입니다. 그렇지 않으면 모든 문자열을 거부합니다.
Rav

2
$ 안에서 음의 룩어과 .*끝 모두 중요한 비트이다. 항상 RE와 마찬가지로 강력한 단위 테스트 세트는이를 올바르게 수행하는 데 절대적으로 중요합니다. 이 대답은 100 % 정답입니다.
Tom Dibble

1
\b(?=\w)(?!(ma|(t){1}))\b(\w*)

이것은 주어진 정규식에 대한 것입니다.
\ b는 단어 경계를 찾는 것입니다.
긍정적 인 전망 (? = \ w)은 공백을 피하기 위해 여기에 있습니다.
원래 정규식에 대한 부정적인 전망은 일치를 방지하는 것입니다.
마지막으로 (\ w *)는 남은 모든 단어를 잡는 것입니다.
단어를 보관할 그룹은 그룹 3입니다
. 하위 문자열이
단순 ^ (?! (?: m {2} | t) $) 와 일치하므로 단순 (?! 패턴)은 작동하지 않습니다 . * $는 세분성이 전체 라인이므로 작동하지 않습니다.


0

laravel을 사용하는 경우 이것을 적용하십시오.

Laravel에는 검증중인 필드가 주어진 정규 표현식과 일치하지 않아야하는 not_regex가 있습니다. preg_match내부적으로 PHP 기능을 사용합니다 .

'email' => 'not_regex:/^.+$/i'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.