2009-07-23 10 views
13

मैं के माध्यम से देख कर दिया है अतः और हालांकि इस सवाल का एक परिदृश्य में उत्तर दिया गया है:Regex एक पैटर्न मिलान करने के लिए है, लेकिन बाहर निकालने के शब्दों का एक सेट

Regex to match all words except a given list

यह काफी नहीं है कि मैं क्या तलाश कर रहा हूँ है । मैं एक नियमित अभिव्यक्ति लिखने की कोशिश कर रहा हूं जो फ़ॉर्म की किसी भी स्ट्रिंग से मेल खाता है [\ w] + [(], लेकिन जो तीन तारों "बिल्ली (", "कुत्ते (" और "भेड़ (" विशेष रूप से

से मेल नहीं खाता है

मैं अग्रदर्शी और lookbehind साथ खेल रहे हैं, लेकिन मैं काफी वहाँ नहीं मिल सकता है। मैं इस overcomplicating किया जा सकता है, इसलिए किसी भी मदद बहुत सराहना की जाएगी।

उत्तर

21

नियमित अभिव्यक्ति कार्यान्वयन look-ahead or look-behind assertions का समर्थन करता है, तो आप इस्तेमाल कर सकते हैं निम्नलिखित:

  • एक नकारात्मक लुक-आगे दावे का उपयोग करना:

    \b(?!(?:cat|dog|sheep)\()\w+\(
    
  • एक नकारात्मक लुक-पीछे दावे का उपयोग करना:

    \b\w+\((?<!\b(?:cat|dog|sheep)\() 
    

मैं \b लंगर है कि एक word boundary निशान गयी। तो catdog( मिलान किया जाएगा हालांकि इसमें dog( है।

लेकिन जब आगे के अनुमानों को रेगेक्स कार्यान्वयन द्वारा व्यापक रूप से समर्थित किया जाता है, तो पीछे-पीछे के दावे के साथ रेगेक्स अधिक कुशल होता है क्योंकि यह केवल तभी परीक्षण किया जाता है जब पिछले रेगेक्स (हमारे मामले में \b\w+\() पहले से ही मेल खाता है। हालांकि से पहले वास्तविक पुनर्विक्रय मैच से पहले अनुमानित अनुमान का परीक्षण किया जाएगा। तो हमारे मामले में जब भी \b मिलान किया जाता है तो आगे की ओर से दावा किया जाता है।

+1

दूसरा सबसे संभावित रूप से सक्षम है क्योंकि यह नकारात्मक स्थिति के साथ हर एक स्थिति की जांच नहीं करता है (यह ध्यान देने योग्य है कि वे नकारात्मक हैं।) इसके अलावा, मुझे लगता है कि नकारात्मक होना बेहतर हो सकता है कोष्ठक के बाद पीछे देखो और देखो-पीछे में एक कोष्ठक शामिल करें। इस तरह, स्ट्रिंग में प्रत्येक शब्द के बजाय, यह संभव मिलान मिलने के बाद केवल एक अतिरिक्त लुक-बैक करेगा। – Blixt

+0

@ ब्लास्ट: अच्छा बिंदु। – Gumbo

+0

इसके अलावा, आपका पहला रेगेक्स 'आपदा' (', 'dogmatic (' और' भेड़िये '(' आपका दूसरा एक समान त्रुटि से '\ b'' के पीछे देखो में अस्वीकार कर देगा। – rampion

3

क्या आपको वास्तव में एक ही रेगेक्स में इसकी आवश्यकता है? यदि नहीं, तो सबसे सरल कार्यान्वयन केवल दो regexes है - एक यह जांचने के लिए कि आप अपने वर्जित शब्दों में से किसी एक से मेल नहीं खाते हैं, और एक को आपके \ w + से मिलान करने के लिए, तार्किक और जंजीर से जुड़ा हुआ है।

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