2009-04-04 17 views
70

शामिल नहीं है मैं कम से कम समूह से लिपटे के चयन के लिए इसनियमित अभिव्यक्ति है कि कुछ स्ट्रिंग

aabbabcaabda

की तरह कुछ है एक मैं इस /a([^a]*)a/ जो सिर्फ ठीक काम करता है

लेकिन मुझे द्वारा लिपटे समूहों के साथ समस्या है, जहां मुझेजैसे कुछ चाहिए/aa([^aa]*)aa/ जो काम नहीं करता है, और मैं /aa([^a]*)aa/ जैसे पहले व्यक्ति का उपयोग नहीं कर सकता, क्योंकि यह के पहले अवसर पर समाप्त होगा, जो मैं नहीं चाहता हूं।

आम तौर पर, किसी भी तरह से, कैसे उसी तरह से स्ट्रिंग मैं कह सकता हूँ कि [^a] साथ चरित्र नहीं शामिल नहीं होता है कहने के लिए है?

सीधे शब्दों में कहा, मैं छोड़कर अनुक्रम किसी भी चरित्र के बाद की जरूरत है और फिर

+0

@SteveChambers आपको पता है कि यह प्रश्न 7 साल से अधिक पुराना है और पहले से ही एक स्वीकार्य उत्तर है? –

+1

निश्चित रूप से लेकिन जैसा कि मैं समझता हूं कि इनमें से कोई भी बिंदु एक कारण नहीं है, इसे डुप्लिकेट से जोड़ा नहीं जाना चाहिए। –

उत्तर

17

सामान्य तौर पर यह एक दर्द के साथ समाप्त होता है एक नियमित रूप से नहीं अभिव्यक्ति लिखने के लिए एक विशेष स्ट्रिंग युक्त। हमें गणना के मॉडल के लिए ऐसा करना था - आप एक एनएफए लेते हैं, जो परिभाषित करने के लिए काफी आसान है, और फिर इसे नियमित अभिव्यक्ति में कम कर देता है। "बिल्ली" युक्त चीजों के लिए अभिव्यक्ति लगभग 80 वर्ण लंबी थी।

संपादित करें: मैं अभी-अभी समाप्त और हाँ, यह है:

aa([^a] | a[^a])aa 

Here एक बहुत ही संक्षिप्त ट्यूटोरियल है। मैंने पहले कुछ महान लोगों को पाया, लेकिन अब मैं उन्हें नहीं देख सकता।

+0

क्या आप किसी भी ट्यूटोरियल के बारे में जानते हैं जो इसे समझाता है? –

+0

यहां एक अच्छा रेगेक्स ट्यूटोरियल है: http://www.regular-expressions.info/ –

+0

हैलो, क्या आप इसके बारे में निश्चित हैं? क्या कोई हमें बता सकता है कि मेरे उत्तर में कुछ गड़बड़ है: http://stackoverflow.com/a/27060278/461444 – AFract

10

आपको बस एक अनिच्छुक परिमाणक है:

regex: /aa.*?aa/ 

aabbabcaabda => aabbabcaa 

aaaaaabda  => aaaa 

aabbabcaabda => aabbabcaa 

aababaaaabdaa => aababaa, aabdaa 

आप नकारात्मक अग्रदर्शी भी इस्तेमाल कर सकते हैं, लेकिन इस मामले में यह सिर्फ एक अधिक वर्बोज़ तरह से इसी कार्य को पूरा है। इसके अलावा, यह gpojd की तुलना में थोड़ा छोटा है। डॉट को अगले चरित्र का उपभोग करने की अनुमति देने से पहले प्रत्येक स्थिति पर लुकहेड लागू किया जाना चाहिए।

/aa(?:(?!aa).)*aa/ 

दृष्टिकोण Claudiu और finnw द्वारा सुझाए गए के रूप में, यह ठीक काम करेंगे जब प्रहरी स्ट्रिंग केवल दो वर्ण लंबा है, लेकिन (के रूप में स्वीकार किया Claudiu) यह अब तार के लिए भी बोझल है।

+1

मुझे लगता है कि हमारा तरीका एकमात्र तरीका है जो गैर-बैकट्रैकिंग कार्यान्वयन के साथ काम करेगा (http: // swtch.com/~rsc/regexp/regexp1.html), लेकिन हाँ, यह बहुत परेशान है। मैं सिर्फ इन लुकअप चीजों के बारे में जानने के लिए पर्याप्त regex नहीं जानता =)। – Claudiu

+0

अधिकांश आधुनिक रेगेक्स स्वाद, विशेष रूप से प्रोग्रामिंग भाषाओं में निर्मित, बैकट्रैकिंग, एनएफए प्रकार के हैं। यहां तक ​​कि जावास्क्रिप्ट, कम से कम फीचर स्वादों में से एक, लुकहेड और अनिच्छुक क्वांटिफायर का समर्थन करता है। http://www.regular-expressions.info/refflavors.html –

186

मैं a blogpost from 2007 पाया गूगल की शक्ति है जो निम्नलिखित regex कि स्ट्रिंग से मेल खाता है जो नहीं है एक निश्चित स्ट्रिंग शामिल देता है द्वारा:

^((?!my string).)*$ 

यह काम करता है इस प्रकार है: यह शून्य या अधिक के लिए लग रहा है (*) अक्षर (।) जो शुरू नहीं करते हैं (?- ऋणात्मक लुकहेड) आपकी स्ट्रिंग और यह निर्धारित करता है कि पूरी स्ट्रिंग को ऐसे वर्णों से बनाया जाना चाहिए (^ और $ एंकर का उपयोग करके)। या इसे एक अन्य तरीके से रखने के लिए:

संपूर्ण स्ट्रिंग वर्णों से बना होना चाहिए जो किसी दिए गए स्ट्रिंग को शुरू नहीं करते हैं, जिसका अर्थ है कि स्ट्रिंग में दिए गए सबस्ट्रिंग नहीं होते हैं।

+7

दस्तावेज़ों के मुताबिक, यह नकारात्मक दिखने वाला है, –

+0

(उद्धृत ब्लॉग से) पूर्ण regexp रेफरी नहीं दिखता है: http://www.regular-expressions.info /refadv.html –

+1

प्रश्न के लिए सही समाधान है: '^ aa (?!। * aa। * aa)। * aa $' यानी ** aa ** से शुरू करें, आगे देखो और चयनों को त्यागें जो ** [कुछ भी] aa [कुछ भी] aa **, और ** aa ** –

2
".*[^(\\.inc)]\\.ftl$" 

जावा में इस ".ftl" में समाप्त होने वाले लेकिन ".inc.ftl" में समाप्त होने वाले नहीं सभी फाइलों को मिलेगा, जो कि मैं वास्तव में क्या करना चाहता था।

+2

'[] 'विभाजित' inc'' i', 'n',' c' में। तो यह '' aiftl ".matches ("। * [^ (\\। Inc)] \\। Ftl $ ") 'और' "a.inc.ftl" .matches ("। * [^(\\। इंक)] \\। FTL $ ")'। –

4

मैं निम्नलिखित कोड को जेएस-फाइलों के सभी संदर्भों में एक जीईटी-पैरामीटर जोड़ने के लिए प्रतिस्थापित करना था।

(?<!EXCEPTION)(\.js) 

करता क्या है कि ".js" के सभी आवृत्तियां के लिए देखो और अगर वे "अपवाद" स्ट्रिंग द्वारा preceeded कर रहे हैं, के परिणामस्वरूप आपको त्यागने है:

<link rel="stylesheet" type="text/css" href="/login/css/ABC.css" /> 
<script type="text/javascript" language="javascript" src="/localization/DEF.js"></script> 
<script type="text/javascript" language="javascript" src="/login/jslib/GHI.js"></script> 
<script type="text/javascript" language="javascript" src="/login/jslib/md5.js"></script> 
sendRequest('/application/srvc/EXCEPTION.js', handleChallengeResponse, null); 
sendRequest('/application/srvc/EXCEPTION.js",handleChallengeResponse, null); 

यह प्रयोग किया जाता है Matcher परिणाम सरणी इसे नकारात्मक दिखने वाला कहा जाता है। चूंकि मैंने यह जानने के लिए एक दिन बिताया कि यह कैसे करना है, मैंने सोचा कि मुझे साझा करना चाहिए।

6

मुझे यकीन नहीं है कि यह एक मानक निर्माण है, लेकिन मुझे लगता है कि आपको "ऋणात्मक लुकहेड" (जो लिखता है: "?!" उद्धरण के बिना) पर एक नज़र रखना चाहिए। स्वीकृत एक सहित इस धागे के सभी उत्तरों की तुलना में यह कहीं अधिक आसान है।

उदाहरण: Regex: "^ (?! 123) [0-9] * \ डब्ल्यू" किसी भी स्ट्रिंग, पत्र के बाद अंकों द्वारा शुरू कैप्चर करता है जब तक कि अगर "इन अंक" कर रहे हैं 123

http://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx#grouping_constructs (माइक्रोसॉफ्ट पेज, लेकिन काफी व्यापक) लुकहेड/लुकबींड

पीएस: यह मेरे लिए अच्छा काम करता है (नेट)। लेकिन अगर मैं किसी चीज़ पर गलत हूं, तो कृपया हमें बताएं। मुझे यह निर्माण बहुत सरल और प्रभावी लगता है, इसलिए मैं स्वीकृत उत्तर से हैरान हूं।

संबंधित मुद्दे