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

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

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

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

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

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



답변

시험:

/(?!.*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


답변

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

foo(?!bar)

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


답변

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

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

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


답변

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

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

새로운 정규식

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

샘플 텍스트

foowithbar fooevenwithfoobar notfoobar foohere notfoobarhere butfooisokherebar notfoobarhere andnofuu needsfoo

성냥

foowithbar fooevenwithfoobar foohere butfooisokherebar needsfoo


답변

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

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

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

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


답변