2008-08-04 13 views
41

मैं निम्न स्वरूप में एक फ़ाइल में दो टैग के बीच एक उप-स्ट्रिंग बाहर खींच करने के लिए:Regex: एक स्ट्रिंग

 
Data Data 
Data 
[Start] 
Data I want 
[End] 
Data 

मैं का उपयोग कर [Start] और [End] टैग के बीच से Data I want हड़पने के लिए करना चाहते हैं एक रेगेक्स क्या कोई मुझे दिखा सकता है कि यह कैसे किया जा सकता है?

+1

समान करने के लिए "रेगुलर एक्सप्रेशन से टैग के भीतर पाठ प्राप्त करने के लिए" - http://stackoverflow.com/questions/353309/regex-to-get-text-within-tags –

उत्तर

21
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\] 

यह उम्मीद है कि [start] और [end] मार्कर के रूप में अच्छी तरह से कर दिया जाएगा।

+2

आगे की ओर देखो कम कुशल हो सकता है लेकिन मुझे लगता है कि अगर आपने अप्रत्याशित '[प्रारंभ]' या '[end]' है तो इसे तोड़ने से कैसे रोका। किनारे के मामलों के बारे में सोचना और उन्हें पसंद करना हमेशा अच्छा होता है। –

62
\[start\](.*?)\[end\] 

झिचेल एक कैप्चर के भीतर मध्य में टेक्स्ट डाल देगा।

+2

बहुत बेहतर (सरल) स्वीकृत उत्तर से ... :-) – PhiLho

+6

यह अभी भी तारों को पकड़ नहीं पाएगा जिनके पास लाइन ब्रेक – Doug

+2

@Doug उपयोग विकल्प dotall है। रेगेक्स की कोई समस्या नहीं है। – AlexR

1

पर्ल के साथ आप जिस डेटा को चाहते हैं उसे घेर सकते हैं() और बाद में इसे खींच सकते हैं, शायद अन्य भाषाओं में एक समान सुविधा है। http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi:

if ($s_output =~ /(data data data data START(data data data)END (data data)/) 
{ 
    $dataAllOfIt = $1;  # 1 full string 
    $dataInMiddle = $2;  # 2 Middle Data 
    $dataAtEnd = $3;  # 3 End Data 
} 
4

एक एक regex का उपयोग कर मिलान टैग लगाने के लिए की खामियों की अधिक संपूर्ण चर्चा में पाया जा सकता। विशेष रूप से, ध्यान रखें कि सही तरीके से व्याख्या करने के लिए घोंसले के टैग को वास्तव में एक पूर्ण पार्सर की आवश्यकता होती है।

ध्यान दें कि प्रश्न के उत्तर देने के लिए मामले संवेदनशीलता को बंद करने की आवश्यकता होगी।

$ echo "Data Data Data [Start] Data i want [End] Data" \ 
    | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"' 
Data i want 

अन्य चाल उपयोग करने के लिए है *: पर्ल में, कि मैं संशोधक है? क्वांटिफायर जो कैप्चर किए गए मैच की लालची को बंद कर देता है। उदाहरण के लिए, अगर आपके पास एक गैर मिलान [अंत] टैग:

Data Data [Start] Data i want [End] Data [end] 

आप शायद कब्जा करने के लिए नहीं करना चाहती:

Data i want [End] Data 
4

आप पार्स करने के लिए रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं उद्घाटन और समापन टैग के बीच डेटा, आपको लंबे और कठिन सोचने की आवश्यकता है कि यह एक रास्ता है जिसे आप नीचे जाना चाहते हैं। इसके कारण टैग घोंसले की संभावना है: अगर घोंसले के टैग कभी भी हो सकते हैं या कभी भी हो सकते हैं, तो भाषा अब नियमित नहीं होती है, और नियमित अभिव्यक्ति इसे पार्स करने के लिए उचित उपकरण नहीं होती है।

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

वहाँ एक बहुत सामान्य उद्धृत ब्लॉग पोस्ट की चर्चा है कि इस अधिक, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html है

3

ठीक है, अगर आप की गारंटी प्रत्येक शुरू है कि टैग पीछा किया जाता है (इसके लिए गूगल और वर्तमान में कैश की जाँच, वे कुछ अन्तराल आ रही है) एक अंत टैग द्वारा निम्नलिखित निम्नलिखित काम करेंगे।

\[start\](.*?)\[end\] 

हालांकि, अगर आप इस तरह के रूप में follwoing जटिल पाठ है:

[start] sometext [start] sometext2 [end] sometext [end] 

तो आप रेगुलर एक्सप्रेशन के साथ समस्याओं में चलाने होगा।

अब निम्न उदाहरण एक पेज में सभी गर्म लिंक बाहर कर देगा:

'/<a(.*?)a>/i' 

उपरोक्त मामले में हम गारंटी ले सकते हैं कि वहाँ के किसी भी नेस्टेड मामलों नहीं होगा:

'<a></a>' 

तो, यह एक जटिल सवाल है और इसे सरल जवाब के साथ हल नहीं किया जा सकता है।

5
$text ="Data Data Data start Data i want end Data"; 
($content) = $text =~ m/ start (.*) end /; 
print $content; 

मैं थोड़ी देर के & मैं आपको बता सकता इस विधि से काम करता है के लिए एक समान समस्या ... था

0

अंतरिक्ष अक्षर और डॉट्स (.)

साथ टैग के बीच पाठ बाहर निकलने के लिए इस सवाल का संदर्भ लें

[\S\s] एक पाठ पढ़ना मैं

Regex to match any character including new lines

0

प्रयोग किया जाता है स्क्वायर ब्रैकेट में [] i.e. [प्रारंभ] और [अंत] और मानों की सूची के साथ सरणी को मान्य करें। jsfiddlehttp://jsfiddle.net/muralinarisetty/r4s4wxj4/1/

var mergeFields = ["[sitename]", 
        "[daystoholdquote]", 
        "[expires]", 
        "[firstname]", 
        "[lastname]", 
        "[sitephonenumber]", 
        "[hoh_firstname]", 
        "[hoh_lastname]"];  

var str = "fee [sitename] [firstname] \ 
sdfasd [lastname] "; 
var res = validateMeargeFileds(str); 
console.log(res); 

function validateMeargeFileds(input) { 
    var re = /\[\w+]/ig; 
    var isValid; 
    var myArray = input.match(re); 

    try{ 
     if (myArray.length > 0) { 
      myArray.forEach(function (field) { 

       isValid = isMergeField(field); 

       if (!isValid){ 
        throw e;       
       } 
      }); 
     } 
    } 
    catch(e) {   
    } 

    return isValid; 
} 

function isMergeField(mergefield) { 
    return mergeFields.indexOf(mergefield.toLowerCase()) > -1; 
} 
संबंधित मुद्दे