다른 특정 하위 문자열이 뒤 따르지 않는 하위 문자열과 일치하는 정규식


116

일치 blahfooblah하지만 일치 하지 않는 정규식이 필요합니다.blahfoobarblah

bar 뒤에 오지 않는 한 foo와 foo 주변의 모든 것과 일치하기를 원합니다.

나는 이것을 사용해 보았습니다 : foo.*(?<!bar)상당히 가깝지만 blahfoobarblah. 뒤의 부정적인 모습은 바뿐만 아니라 모든 것과 일치해야합니다.

내가 사용하는 특정 언어는 Java 정규식을 사용하는 Clojure입니다.

편집 : 더 구체적으로, 통과해야 blahfooblahfoobarblah하지만 blahfoobarblahblah.


1
foo. * (? <! bar. *)를 사용해 보셨습니까?
Thibault Falise 2010

답변:


158

시험:

/(?!.*bar)(?=.*foo)^(\w+)$/

테스트 :

blahfooblah            # pass
blahfooblahbarfail     # fail
somethingfoo           # pass
shouldbarfooshouldfail # fail
barfoofail             # fail

정규식 설명

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    bar                      'bar'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    foo                      'foo'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

기타 정규식

bar바로 뒤에있을 때만 제외 foo하려면 다음을 사용할 수 있습니다.

/(?!.*foobar)(?=.*foo)^(\w+)$/

편집하다

질문을 구체적으로 업데이트했습니다.

/(?=.*foo(?!bar))^(\w+)$/

새로운 테스트

fooshouldbarpass               # pass
butnotfoobarfail               # fail
fooshouldpassevenwithfoobar    # pass
nofuuhere                      # fail

새로운 설명

(?=.*foo(?!bar))a foo를 찾았지만 직접 따르지는 않습니다.bar


이것은 매우 가깝고 매우 좋은 대답입니다. 나는 내가 충분히 구체적이지 않을 것이라는 것을 알고 있었다. :( 나는 이것을 필요로한다 : "blahfoomeowwoof / foobar /"는 외로운 "foo"때문에 통과하기 위해, 그러나 이것이 가능하다면 blahfoobarmeowwoof이게 아니다.
Rayne

부수적 인 질문으로, "bot"이 아니라 "botters"와 같은 것을 매칭하는 방법은 무엇입니까?
Rayne

예. 지금 가지고있는 것을 사용할 수 있지만 봇만 일치시킬 수 있지만 봇은 일치시키지 않으면 더 쉬울 것입니다. 나는 매우 미안 해요. 나는 정규식에 대한 경험이 없으며 내가 원하는 것을 천천히 파악하고 있습니다. : p
Rayne

1
@ Rayne, 이것은 같은 질문입니다. 당신의 위의 예에서, 당신은 일치하고 싶어 foo하지만 foobar. 일치 시키려면 bot하지만 botters, 당신은 사용합니다 /(?=.*bot(?!ters))^(\w+)$/.
maček 2010

글쎄, 나는 일반적으로 전체 단어를 목표로했습니다. 내가 말했듯이 나는 내가 정말로 원하는 것과 정말로 가능한 것이 무엇인지 혼란스러워한다. 이렇게하면 효과가 있습니다. 시간 내 주셔서 감사합니다. :)
Rayne

55

foo시작하지 않는 항목으로 다음 을 일치 시키려면 다음을 bar시도하십시오.

foo(?!bar)

네거티브 lookbehind가있는 버전은 사실상 "일치 foo다음에 끝나지 않는 항목 bar"입니다. .*모든 일치 barblah하고 (?<!bar)외모에 백업 lah과 일치하지 않음을 확인 bar전체 패턴 일치하므로, 그것은하지 않습니다.


그래서 "say"가 뒤 따르지 않는 한 "did you"라는 문자열과 일치하도록 설계된 정규식을 위해 이것을 시도했습니다. 예를 들어 "당신이 말했습니까"와 "당신이 생각 했습니까"를 구별 할 때 작동하지만 "당신이"그 자체만으로는 포착되지 않습니다. 어떤 제안?
soosus

2

대신 부정적인 전망을 사용하십시오.

\s*(?!\w*(bar)\w*)\w*(foo)\w*\s*

이것은 나를 위해 일했으며 도움이되기를 바랍니다. 행운을 빕니다!


반복되는 문자열 ( "foofoo")을 제외하는데도 작동하는 간단하면서도 효과적인 정규식입니다. 완전한!
Jonas Byström 2014 년

1

전체 문자열 자체가 아닌 문자열의 모든 단어와 일치하도록 작동하도록 제안하는 주석을 작성했습니다.

이 모든 것을 댓글로 으깨는 대신 새로운 답변으로 게시하고 있습니다.

새로운 정규식

/(?=\w*foo(?!bar))(\w+)/

샘플 텍스트

foowithbar fooevenwithfoobar notfoobar foohere notfoobarhere butfooisokherebar notfoobarhere andnofuu needsfoo

성냥

foowithbar fooevenwithfoobar foohere butfooisokherebar needsfoo


0

특정 일치 요청은 다음을 통해 일치시킬 수 있습니다.

\w+foo(?!bar)\w+

이것은 일치 blahfooblahfoobarblah하지만 일치 하지 않습니다 blahfoobarblahblah.

당신의 정규식 문제 foo.*(?<!bar)는 IS .*foo. 이후의 문자를 포함한 모든 문자와 일치 bar합니다.

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