일치 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
합니다.