2009-09-08 20 views
74

को बाहर करने के लिए नियमित अभिव्यक्ति का उपयोग किसी स्ट्रिंग से मेल खाने के लिए किया जा सकता है, एक विशिष्ट स्ट्रिंग स्थिर को छोड़कर हम "एबीसी" कहें? क्या यह केवल एक विशिष्ट स्ट्रिंग निरंतर बाहर करना संभव है? अग्रिम में आपकी मदद धन्यवाद।RegEx एक विशिष्ट स्ट्रिंग स्थिर

+1

कौन-सा टूल आप कर रहे हैं नहीं है का उपयोग करते हुए? टूल के आधार पर, यह बाहरी आपके रेगेक्स को निर्दिष्ट करने का एक तरीका हो सकता है। grep उदाहरण के लिए, मैच की भावना को उलटने के लिए एक -v विकल्प का समर्थन करता है। –

+1

क्या आप सिर्फ 'अगर (/^एबीसी $ /) अन्य {...} नहीं कर सकते हैं, जहां अन्य एबीसी – Xetius

+0

से मेल नहीं खा रहे हैं तो क्या आप एबीसी भाग को छोड़कर किसी दिए गए स्ट्रिंग के प्रत्येक चरित्र से मेल खाते हैं ? दूसरे शब्दों में, "एबीसी के साथ एक स्ट्रिंग" "स्ट्रिंग के साथ" मेल खाएगी। –

उत्तर

4

यह आसान नहीं है, जब तक कि आपके regexp इंजन के लिए विशेष समर्थन न हो। एक मूल रूप से कहते हैं

$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/ 
    or die "too much foo"; 

कि "अगर यह गैर के साथ शुरू होता: यदि नहीं, तो आप कुछ बुराई क्या करना है

$var !~ /^foo$/ 
    or die "too much foo"; 

: सबसे आसान तरीका है एक नकारात्मक-मिलान विकल्प का उपयोग करने के लिए, उदाहरण के लिए होगा - f, शेष कुछ भी हो सकता है; यदि यह f, गैर-o से शुरू होता है, तो बाकी कुछ भी हो सकता है, अन्यथा, यदि यह fo शुरू होता है, तो अगला चरित्र बेहतर नहीं होगा o "।

+0

वह खाली स्ट्रिंग, 'f',' fo' और 'foo' की अनुमति नहीं देगा। – Gumbo

+0

@ गम्बो: यह खाली स्ट्रिंग को ठीक ठीक करने देता है; ध्यान दें कि ($) पहला विकल्प है, इसलिए^$ (खाली स्ट्रिंग) स्वीकार किया जाता है। मैंने इसका परीक्षण किया, और कम से कम 5.0.10 में खाली स्ट्रिंग स्वीकार कर ली गई है। – derobert

+0

... क्षमा करें, perl 5.10.0, ज़ाहिर है! – derobert

93

आपको ऋणात्मक लुकहेड दावे का उपयोग करना होगा।

(?!^ABC$) 

उदाहरण के लिए आप निम्न का उपयोग कर सकते हैं।

(?!^ABC$)(^.*$) 

यदि यह आपके संपादक में काम नहीं करता है, तो इसे आजमाएं।

^((?!ABC).)*$ 
+1

यह काम करेगा यदि आप ऐसी स्ट्रिंग की तलाश में हैं जिसमें एबीसी शामिल नहीं है। लेकिन क्या वह लक्ष्य है? या एबीसी को छोड़कर हर चरित्र से मेल खाने का लक्ष्य है? –

+0

यह इंगित करने के लिए धन्यवाद कि आप सही हैं - मेरा सुझाव केवल एबीसी से शुरू होने वाली तारों से बचाता है - मैं दावा को लंगर देना भूल गया था। इसे सही करने के लिए जा रहे हैं। –

+0

यह अभी भी जो मैं सोच रहा था उससे अलग है। शायद प्रश्नकर्ता स्पष्ट करेगा कि वे क्या खोज रहे हैं। –

3

आप इस तरह नकारात्मक अग्रदर्शी, या कुछ और इस्तेमाल कर सकते हैं:: यह गहरे लाल रंग का और जावास्क्रिप्ट में काम करने के लिए परीक्षण किया जाता है

^([^A]|A([^B]|B([^C]|$)|$)|$).*$ 

हो सकता है कि यह थोड़ा सरल किया जा सकता है।

3

नेट में आप इस तरह अपने लाभ के लिए उपयोग कर सकते हैं समूहीकरण:

http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31

आपको पता चलेगा कि:

(ABC)|(.) 

2 समूह में एबीसी के अलावा सब कुछ हड़पने जाएगा। प्रत्येक समूह के चारों ओर पैरेन्थेसिस। तो (एबीसी) समूह 1 और है समूह 2.

तो आप बस में इस तरह 2 समूह हड़पने है एक की जगह (।):

$2 

या अंदर समूह संग्रह में नेट नज़र में थोड़ा और नियंत्रण के लिए Regex वर्ग।

आपको अन्य रेगेक्स कार्यान्वयन में कुछ भी करने में सक्षम होना चाहिए।

अद्यतन: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03

यह अभी भी (मैं एक तरीका है कि समूह का उपयोग नहीं करता नहीं मिल सकता है) समूहीकरण का उपयोग करता है: मैं एक बहुत तेजी से जिस तरह से इस यहाँ करने के लिए मिल गया। लेकिन यह विधि पहले की तुलना में 10X से अधिक तेज है।

2

इस नियमित अभिव्यक्ति का प्रयास करें:

^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$ 

यह तीन मामलों में बताता है:

  1. कम से कम तीन मनमाना चरित्र
  2. ठीक तीन वर्ण, जबकि या तो
    • पहली नहीं है A, या
    • पहले A है लेकिन दूसरे B, या
    • पहले A है, दूसरा B नहीं है, लेकिन तीसरे C
  3. तीन से ज्यादा स्वैच्छिक वर्णों
संबंधित मुद्दे