2011-11-23 2 views
22

내 문제를 포함하지 않는 문자열과 일치하는 정규식이 난 순수 정규식과 browserstring을 확인하려는입니다. /?((?<=Android)(?:[^])*?(?=Mobile))/i 하지만 정확히 잘못 일치 : -을 포함하지만, B

Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 

>

Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; Nexus One Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 

나의 시도 솔루션과 일치하지 말아야 일치해야하는 것입니다.

+2

어떤 언어인가, 정규 표현식입니까? http://www.regular-expressions.info/tools.html – sehe

+0

는 것은 매우 쉬운 일이 아니다 [http://stackoverflow.com/q/8186424/241506][1] [1] : http://stackoverflow.com/q/8186424/241506 – VMykyt

+0

'(? : [^]) *? '로 무엇을 표현하고 싶습니까? – stema

답변

2

난 그냥 정규식 flaviour에 따라 말했다

if ((m/Android/i) && (m/Safari/i) && !(m/Mobile Safari/i)) 

, 당신은

if ((m/Android/i) && (m/(?<!Mobile)Safari/i)) 

또는 참고도

if (m/Android.*(?<!Mobile)Safari/i) 

볼 것을 결합 할 수있는 최대 그것을 깰 것 Lookahead/lookbehind


업데이트는 테스트 Perl5에 정규식 맛 (틀림없이 가장 인기있는 맛) 이러한 미세 :

perl -ne 'print "$. yes\n" if m/Android.*(?<!Mobile)Safari/i' 

쇼 : 영업에서 주어진 입력에 대한

1 yes 

+0

가장 단순한 pure-regex 접근 방식으로 Perl5 호환 regexen – sehe

2

으로 정규 표현식의 일부 구현에서는 부정적인 lookbehind 어설 션을 사용할 수 있습니다. 문자열의 현재 위치가 ...

에 대한 일치가 선행되지 않은 경우에만 워드 프로세서 당 는 (?<!...)으로 작성 부정적인 lookbehind 다음은 샘플 문자열 부정적인 lookbehind를 사용하는 방법을 보여주는 파이썬 대화 형 스크립트의 일치 :

>>> s = "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13" 
>>> bool(re.search(r'Android.*(?<! Mobile) Safari', s)) 
True 

>>> t = "Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; Nexus One Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" 
>>> bool(re.search(r'Android.*(?<! Mobile) Safari', t)) 
False 
37

당신은 문자열 단어를 포함 아닌지 확인하기 위해 앞서 주장을 모양을 사용합니다.

당신이 문자열이 어떤 장소에서 "안드로이드"이 포함되어 있음을 보장하려면 당신은 이런 식으로 작업을 수행 할 수 있습니다

^(?=.*Android).* 

당신은 또한 어떤 장소에서 "안드로이드"가 포함되어 있는지 확인하기 위해 그들을 결합 할 수 있습니다 그리고 어떤 장소에서 "모바일"

^(?=.*Android)(?!.*Mobile).* 
: 당신이 특정 단어가 문자열되지 않도록하려면

^(?=.*Android)(?=.*Mobile).* 

는 앞서 부정적인 모습을 사용

이 "문자열 단어에있을 안드로이드"라는 단어를 필요로 모바일은 "문자열에서 허용되지 않습니다. .* 부분은 처음에 주장에 해당하는 전체 문자열/행을 일치합니다.

보기 here on Regexr

+0

+1로 테스트했지만'^ (? =. * Android) (?!. * Mobile). *'로 작성했습니다. 그렇지 않으면 선행문이 모든 위치에 적용되거나 둘 모두 성공할 때까지 미리보기가 적용됩니다. 긍정적 인 선견자가 항상 처음부터 어디서나 실패하기 때문에 정규 표현식이 예상대로 작동하지만 부정적인 선견서 만 있다면 어떨까요? –

+0

@ AlanMoore 제안에 감사 드리며, 그것을 사용하여 내 대답을 편집했습니다. – stema