source

특정 서브스트링 뒤에 없는 서브스트링과 일치시키는 정규식

goodcode 2022. 9. 4. 15:00
반응형

특정 서브스트링 뒤에 없는 서브스트링과 일치시키는 정규식

매치할 정규식이 필요해요.blahfooblah하지만 아니다blahfoobarblah

술집 뒤에 바만 없으면 foo와 foo 주변의 모든 것들과 매치하고 싶습니다.

이것을 사용해 보았습니다.foo.*(?<!bar)꽤 가깝지만, 일치합니다.blahfoobarblah. 뒤에 있는 부정적인 시선은 바(bar)가 아니라 어떤 것과도 일치해야 합니다.

제가 사용하고 있는 언어는 Clojure입니다.Clojure는 Java regexes를 후드 아래에 사용합니다.

EDIT: 좀 더 구체적으로 말하면, 합격하기 위해서도 필요합니다.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))확실히foo발견되었지만 직접 팔로우되지는 않습니다.bar

일치시키려면foo시작도 하지 않는 것을 따라가는 것bar,해라

foo(?!bar)

부정적인 뒷모습을 가진 버전은 사실상 "match a"입니다.foo끝나지 않는 것이 뒤따른다bar". 그.*모든 것과 일치하다barblah, 및(?<!bar)돌아보다lah일치하지 않는지 확인합니다.bar그렇지 않으니 모든 패턴이 일치합니다

대신 부정적인 전망을 사용하세요.

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

효과가 있었어요 도움이 됐으면 좋겠네요행운을 빕니다.

문자열 자체보다 문자열 내의 모든 단어를 일치시키는 작업을 수행하도록 제안하는 댓글을 작성했습니다.

댓글로 다 치우는 게 아니라 새로운 답변으로 올리는 거예요.

새 정규식

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

샘플 텍스트

푸위트바 fooebor fooebor notfoo butfooisokerebar notfoohere and nofu needsfoo

일치.

푸위트바 푸우브와 푸우바 푸우브이소케어바 니즈푸우

특정 일치 요청은 다음과 같이 일치시킬 수 있습니다.

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

이것은 일치할 것이다.blahfooblahfoobarblah하지만 아니다blahfoobarblahblah.

의 정규식에 관한 문제foo.*(?<!bar).*끝나고foo. 다음 문자를 포함한 모든 문자와 일치합니다.bar.

언급URL : https://stackoverflow.com/questions/2631010/a-regex-to-match-a-substring-that-isnt-followed-by-a-certain-other-substring

반응형