2010-10-28 14 views
7

कल्पना कीजिए कि हमारे पास एक लंबी स्ट्रिंग है जिसमें सबस्ट्रिंग्स 'बिल्ली' और 'कुत्ते' के साथ-साथ अन्य यादृच्छिक वर्ण भी शामिल हैं।स्ट्रिंग पैटर्न मिलान समस्या

cat x dog cat x cat x dog x dog x cat x dog x cat 

यहां 'एक्स' वर्णों के किसी भी यादृच्छिक अनुक्रम का प्रतिनिधित्व करता है (लेकिन 'बिल्ली' या 'कुत्ता' नहीं)।

मैं जो करना चाहता हूं उसे 'कुत्ते' और उसके बाद 'बिल्ली' को छोड़कर किसी भी पात्र द्वारा पीछा किया जाता है। मैं प्रत्येक मामले में 'बिल्ली' के पहले उदाहरण को हटाना चाहता हूं।

इस मामले में, मैं कोष्ठकों के भीतर [बिल्ली] निकालना चाहते हैं नहीं अगले 'बिल्ली' इससे पहले कि यह करने के बाद 'कुत्ता' है क्योंकि:

cat x dog x cat x dog x dog x cat x dog x cat 
:

cat x dog [cat] x cat x dog x dog x cat x dog x cat 

के साथ समाप्त करने के लिए

यह कैसे किया जा सकता है?

मैं किसी भी तरह (एन) (? = (एन)) की तरह रेगुलर एक्सप्रेशन के उपयोग के बारे में सोचा के रूप में VonC सिफारिश here

(cat)(?=(.*cat)) 

स्ट्रिंग में 'बिल्ली' के जोड़े का मिलान हो। लेकिन मुझे अभी भी यकीन नहीं है कि मैं प्रत्येक बिल्ली को हटाने के लिए इसका उपयोग कैसे कर सकता हूं जिसे 'बिल्ली' से पहले 'कुत्ते' के बाद नहीं किया जाता है।


वास्तविक समस्या जिसका मैं सामना कर रहा हूं वह जावा में है। लेकिन मैं वास्तव में सिर्फ एक सामान्य छद्म कोड/रेगेक्स समाधान की तलाश में हूं।

+0

हाय। यह जानना उपयोगी होगा कि आप किस भाषा में काम कर रहे हैं। –

+0

@klausbyskov: क्या आप उस संपादन के बारे में निश्चित हैं? निम्नलिखित दो वाक्य और उदाहरण मुझे यह इंगित करने के लिए प्रतीत होता है कि "पीछा" वास्तव में उसका मतलब था। –

+0

मेरा मतलब था 'पीछा' पहले नहीं था! – nodmonkey

उत्तर

2

क्या कोई विशेष कारण है कि आप इसे केवल एक आरई कॉल के साथ करना चाहते हैं? मुझे यकीन नहीं है कि यह वास्तव में एक आरई में संभव है।

अगर मुझे ऐसा करना पड़ा, तो शायद मैं दो पास में जाऊंगा। सबसे पहले स्ट्रिंग में 'बिल्ली' और 'कुत्ते' के प्रत्येक उदाहरण को चिह्नित करें, फिर यह पहचानने के लिए कि कौन सी बिल्लियों को हटाने की आवश्यकता है, कुछ कोड लिखें, और इसे दूसरे पास में करें।

स्यूडोकोड इस प्रकार है:

// Find all the cats and dogs 
int[] catLocations = string.findIndex(/cat/); 
int[] dogLocations = string.findIndex(/dog/); 
int [] idsToRemove = doLogic(catLocations, dogLocations); 

// Remove each identified cat, from the end to the front 
for (int id : idsToRemove.reverse()) 
    string.removeSubstring(id, "cat".length()); 
संबंधित मुद्दे