2010-07-25 19 views
5

के भीतर किसी शब्द की हर घटना को कैप्चर करता है कहें कि मेरे पास टेक्स्ट की एक लंबी स्ट्रिंग है, और मैं हर बार this शब्द गोलाकार ब्रैकेट के भीतर वर्णित करना चाहता हूं। ऐसा कैसे किया जा सकता था? निम्नलिखित पैटर्न केवल पहले this से मेल खाता है, के बाद हर घटना की अनदेखी: (रेगेक्स दो delimiters

Etiam scelerisque, Nunc एसी egestas consequat, odio:

/\(.*(this).*\)/g 

उदाहरण के लिए, निम्न पाठ पर ऊपर पद्धति का उपयोग कर यह निब euismod nulla, eget auctor orci nibh vel यह nisi। Aliquam यह खंड खंड)।

odio शब्द के बाद केवल पहले this लौटाएगा।

मैं क्या गलत कर रहा हूं?

+0

पर अंकित मूल्य पर की कोशिश, मैं उस पैटर्न के साथ कुछ भी गलत नहीं दिख रहा है ... कोड आप में प्रयोग कर रहे हैं पोस्ट –

+0

ठीक है, तो आपके नमूना पाठ में 3 "यह" हैं। तो अपेक्षित आउटपुट क्या है ?? क्या आप उन ब्रैकेट में "इस" की संख्या की गिनती चाहते हैं? या आप बस उन ब्रैकेट के बीच जो भी हो, वापस लौटना चाहते हैं? आउटपुट – ghostdog74

+0

+1 प्रोपटर यूटी लिंगुआ लैटिना के रूप में आप जो चाहते हैं उसे स्पष्ट रूप से वर्णन करें। :) – danlei

उत्तर

6

सबसे पहले, लालची मत बनो।

/\(.*?(this).*?\)/g

दूसरे, अगर आप 'इस' की पुनरावृत्ति की संख्या गिनती करने के लिए लक्ष्य कर रहे हैं, एक regex शायद नहीं यहाँ सही उपकरण है। समस्या यह है कि आपको यह निर्धारित करने के लिए बंद करने वाले डिलीमीटर से मिलान करने की आवश्यकता है कि पहला 'यह' संलग्न है, जिसका अर्थ है कि रेगेक्स को लागू करना जारी रखना पहले से ही उपभोग करने वाले सेट के अंदर से मेल नहीं खाएगा।

regex मैं ऊपर जैसे कार्य कर पकड़ेगा: (यह केवल सीमांकक के प्रत्येक सेट के लिए एक बार में दो बार से मेल खाएगी,)

foo (baz this bar) (foo this)

लेकिन नहीं:

foo (this this bar) baz (this this this)

कोशिश एक regex के बजाय एक सरल एकल पास स्कैनर का उपयोग कर। एक और विकल्प दो नियमित अभिव्यक्तियों का उपयोग करना है, एक स्ट्रिंग को संलग्न और गैर-संलग्न खंडों में अलग करने के लिए, और दूसरे को संलग्न क्षेत्रों में खोजना है।

1

.* का उपयोग आपकी खोज स्ट्रिंग में प्रत्येक वर्ण से मेल खाने जा रहा है। तो आप वास्तव में यहां क्या कर रहे हैं, this की पहली घटना को पहले और बाद में सबकुछ मेल खाता है। आपके मौजूदा मैच के परिणाम शायद निम्नलिखित की तरह एक छोटा सा लग:

["(odio this nibh euismod nulla, eget auctor orci nibh vel this nisi. Aliquam this erat volutpat)", "this"] 

कहाँ सरणी में पहला आइटम पूरे अभिव्यक्ति के अनुरूप सबस्ट्रिंग, और सब कुछ इस प्रकार है कि है अपने regex के कब्जा कर लिया मान हैं।

आप this कोष्ठकों के अंदर के हर घटना मैच के लिए चाहते हैं, एक समाधान पहले कोष्ठकों के अंदर सब कुछ की सबस्ट्रिंग प्राप्त करने के लिए किया जाएगा, तो उस सबस्ट्रिंग में this के लिए खोज:

# Match everything inside the parentheses 
/\([^\)]*\)/ 

# Match all occurrences of the word 'this' inside a substring 
/this/g 
0

मैं कार्यान्वित रेगुलर एक्सप्रेशन से नीचे regex का उपयोग करके सभी अक्षरांकीय वर्णों को संलग्न करने:

# cat testfile 
aabc a1 +++ xyz 20 30 =40 -r 
# cat testfile | sed -e "s/\([[:alnum:]]\{1,\}\)/<pre>\1<post>/g" 
<pre>aabc<post> <pre>a1<post> +++ <pre>xyz<post> <pre>20<post> <pre>30<post> =<pre>40<post> -<pre>r<post> 
# 

आशा है कि यह मदद करता है।