2013-08-14 4 views
10

아래의 패턴을 제외해야합니다.RegEx - 일치 패턴 제외

make it cheaper 
make it cheapere 
makeitcheaper.com.au 
makeitcheaper 
making it cheaper 
www.make it cheaper 
ww.make it cheaper.com 

나는이과 일치하는 정규 표현식을 만들었습니다. 그러나, 나는 이것들 이외의 모든 것을 얻고 싶습니다. 내가 만든이 정규식을 역전하는 방법을 잘 모르겠습니다. 패턴 위

mak(e|ing) ?it ?cheaper 

나열된 모든 문자열과 일치합니다. 이제 나는 다른 모든 것과 일치시키기를 원합니다. 어떻게해야합니까?

검색을 통해 네가 부정적인 lookahead/look back과 같은 것을 필요로하는 것 같습니다. 그러나, 나는 그것을 실제로 얻지 않는다. 어떤 사람이 올바른 방향으로 나를 가리킬 수 있습니까?

답변

17

당신은 너무처럼 음의 예견에 넣을 수 있습니다 그냥 그렇게

(?!mak(e|ing) ?it ?cheaper) 

당신이 matches 1을 할 경우, 이후 있지만 작동하지 않을, 그것은하지 않습니다 당신이 단지 앞을보고 있기 때문에 당신은 실제로 어떤 것도 매칭하지 않고, find 을 입력하면 다음 문자가없는 문자열의 많은 곳에서 시작할 수 있기 때문에 여러 번 일치합니다 위와 일치하지 않습니다. 당신이 정확히 그 중 하나 (예 : "그것을 cheaperblahblah 수 있도록"모든 문자열을 제외 할 경우

  1. :

    는 당신이하고자하는 내용에 따라,이 문제를 해결하려면, 우리는이 선택 사항이 있습니다) 제외되지 않으며, 문자열의 시작 (^)과 끝 ($) 확인 :

    ^(?!mak(e|ing) ?it ?cheaper$).* 
    

    .* (0 개 이상의 와일드 카드) 실제 일치 일어나고입니다. 네거티브 미리보기는 첫 번째 문자를 검사합니다.

  2. 당신이 그 중 하나를 포함하는 모든 문자열을 제외 할 경우, 확인 할 수있는보기 미리 모든 문자 앞에 일치하지 않습니다 우리는 일치 :

    ^((?!mak(e|ing) ?it ?cheaper).)*$ 
    

    대안 야생 추가하는 것입니다 - 당신의 look-ahead (ie의 처음에 카드문자열의 시작 부분에서 아무것도 포함하지 않고 패턴을 포함하는 모든 문자열 제외). 그러나 현재 어떤 장점도 보이지 않습니다. 임의의 길이의 미리보기도 주어진 도구에서 지원되지 않습니다. 때문에 ^$ 어느 matches의 경우, 비록 (위 중 하나를 작동하는 find 또는 matches을하는

    ^(?!.*mak(e|ing) ?it ?cheaper).* 
    

^는의 경우 선택 사항이며, find), 미리보기 외부의 .*은 선택 사항입니다.


1 : 그들은 많은 언어가 정규식 matchesfind에 해당하는 기능을 가지고 있음을 호출 할 수 없습니다 수 있지만.


위의 내용은이 질문에 대한 엄격한 정규식 응답입니다.

더 나은 접근법은 원래 정규식 (mak(e|ing) ?it ?cheaper)을 고수하고 사용하는 도구 또는 언어와 직접 일치를 부정 할 수 있는지 확인하는 것입니다.

자바에서, 예를 들어,이 if (string.matches(negLookRegex)) 대신 (반환 된 부울 부정 !을주의) if (!string.matches(originalRegex)) 일을 포함한다.

6

부정적인 예측, 나는 당신이 찾고있는 것이라고 믿습니다.

(?!.*mak(e|ing) ?it ?cheaper) 

을 그리고 어쩌면 좀 더 유연한 : 어쩌면 시도

(?!.*mak(e|ing) *it *cheaper) 

이런 경우에 하나 개 이상의 공간이 있습니다.