2011-11-23 38 views
22

शामिल नहीं है मेरी समस्या यह है कि मैं शुद्ध रेगेक्स के साथ ब्राउज़रस्ट्रिंग को देखना चाहता हूं।क्या एक स्ट्रिंग से मिलान करने के लिए एक रेगेक्स है जिसमें ए है जिसमें बी

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 

मेरी कोशिश की समाधान से मेल नहीं चाहिए: /?((?<=Android)(?:[^])*?(?=Mobile))/i लेकिन यह बिल्कुल गलत मेल खाता है।

+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

मैं सिर्फ इसे तोड़ने था अप

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

जिसके अनुसार, regex flaviour पर निर्भर करता है, आप जोड़ सकता है कि

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

या यहाँ तक कि

if (m/Android.*(?<!Mobile)Safari/i) 
FYI करें

देख Lookahead/lookbehind


अद्यतन परीक्षण Perl5 regex स्वाद (यकीनन सबसे लोकप्रिय स्वाद) के साथ इन ठीक:

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

शो:

1 yes 
ओपी में दिए गए इनपुट के लिए

+0

ने सबसे सरल शुद्ध-रेगेक्स दृष्टिकोण के लिए अब Perl5 संगत regexen – sehe

2

के साथ नियमित अभिव्यक्तियों के कुछ कार्यान्वयन, आप एक नकारात्मक दिखने का दावा कर सकते हैं। डॉक्स के अनुसार, एक नकारात्मक 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).* 

तुम भी उन्हें यह सुनिश्चित करना है कि यह "Android" शामिल कुछ जगह पर गठजोड़ कर सकते हैं और कुछ जगह पर "मोबाइल":

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

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

आप सुनिश्चित करने के लिए कोई खास शब्द स्ट्रिंग में नहीं है चाहते हैं, आगे नकारात्मक दृश्य का उपयोग करें

इस शब्द को "एंड्रॉइड स्ट्रिंग में होना चाहिए और स्ट्रिंग में" मोबाइल "शब्द की अनुमति नहीं होगी। .* भाग तब पूर्ण स्ट्रिंग/पंक्ति से मेल खाता है जब शुरुआत में दावा सही हैं।

इसे देखें here on Regexr

+0

+1 के साथ परीक्षण किया, लेकिन मैं इसे '^ (? =। * एंड्रॉइड) (?! * * मोबाइल) के रूप में लिखूंगा। *'। अन्यथा, लुकहेड हर स्थिति पर लागू किए जाएंगे या जब तक वे दोनों सफल नहीं होंगे। आपके regexes उम्मीद के रूप में काम करते हैं क्योंकि सकारात्मक दिखने हमेशा हर जगह असफल हो जाते हैं, लेकिन शुरुआत, लेकिन क्या होगा यदि आपके पास केवल नकारात्मक दिखने हैं? –

+0

@AlanMoore सुझाव के लिए धन्यवाद, मैंने इसका उपयोग करके इसका जवाब संपादित किया। – stema