2009-07-13 16 views
45

मैं रेगुलर एक्सप्रेशन हर नई लाइन चरित्र (\n) एक XML टैग जो <content> है, या किसी भी टैग है जो अंदर अंदर से मिलान करने के लिए देख रहा हूँ के अंदर हर नई लाइन चरित्र (\ N) मैच के लिए कि <content> टैग, उदाहरण के लिए अंदर:नियमित अभिव्यक्ति एक <content> टैग

<blog> 
<text> 
(Do NOT match new lines here) 
</text> 
<content> 
(DO match new lines here) 
<p> 
(Do match new lines here) 
</p> 
</content> 
(Do NOT match new lines here) 
<content> 
(DO match new lines here) 
</content> 
+2

क्या इसे रेगेक्स होना चाहिए? –

+0

क्या आप क्वार्ट्ज के उत्तर के अनुसार केवल नई लाइनों या सभी पाठों से मेल खाना चाहते हैं? –

+0

हां, यह एक रेगेक्स होना चाहिए, और यह केवल नई लाइनों से मेल खाना चाहिए। –

उत्तर

66

असल में ... आप एक सरल regex यहाँ, कम से कम एक नहीं उपयोग नहीं कर सकते। आपको शायद टिप्पणियों के बारे में चिंता करने की ज़रूरत है! किसी ने लिख सकते हैं:

<!-- <content> blah </content> --> 

आप दो दृष्टिकोण यहाँ ले जा सकते हैं:

  1. पट्टी सभी टिप्पणियों बाहर पहले। फिर रेगेक्स दृष्टिकोण का उपयोग करें।
  2. नियमित अभिव्यक्तियों का उपयोग न करें और एक संदर्भ संवेदनशील पार्सिंग दृष्टिकोण का उपयोग करें जो इस बात पर नज़र रख सके कि आप किसी टिप्पणी में घोंसला रखते हैं या नहीं।

सावधान रहें।

मुझे यह भी सुनिश्चित नहीं है कि आप एक ही समय में सभी नई लाइनों से मेल खा सकते हैं। @Quartz यह एक सुझाव:

<content>([^\n]*\n+)+</content> 

यह क्लोज़िंग के ठीक पहले एक नई पंक्ति चरित्र का अधिकार है कि किसी भी सामग्री को टैग से मिलान करेगा ... लेकिन मुझे यकीन है कि आप सभी नई-पंक्तियों का मिलान करके क्या मतलब है नहीं कर रहा हूँ। क्या आप सभी मिलान किए गए न्यूलाइन अक्षरों तक पहुंचने में सक्षम होना चाहते हैं? यदि ऐसा है, तो आपकी सबसे अच्छी शर्त सभी सामग्री टैग को पकड़ना है, और फिर बीच में घूमने वाले सभी न्यूलाइन वर्णों की खोज करें। कुछ इस तरह के और अधिक:

<content>.*</content> 

लेकिन इसमें भी एक चेतावनी है: regexes लालची हैं, तो यह regex पिछले समापन से एक के लिए पहले खुलने वाला टैग से मेल खाएगी। इसके बजाय, आपको रेगेक्स को दबा देना है, इसलिए यह लालची नहीं है। पाइथन जैसी भाषाओं में, आप इसे "?" के साथ कर सकते हैं रेगेक्स प्रतीक।

मुझे उम्मीद है कि आप इसके कुछ नुकसान देख सकते हैं और यह पता लगा सकते हैं कि आप कैसे आगे बढ़ना चाहते हैं। आप शायद एक्सएमएल पार्सिंग लाइब्रेरी का उपयोग कर बेहतर हैं, फिर सभी सामग्री टैग पर फिर से चल रहे हैं।

मैं जानता हूँ कि मैं सबसे अच्छा समाधान की पेशकश नहीं किया जा सकता है, लेकिन कम से कम मुझे आशा है कि आप इस में कठिनाई और क्यों अन्य उत्तर सही नहीं हो सकता है ...

UPDATE 1 देखेंगे:

मुझे थोड़ी अधिक सारांशित करने दें और मेरी प्रतिक्रिया में कुछ और विवरण जोड़ें। मैं पाइथन के रेगेक्स सिंटैक्स का उपयोग करने जा रहा हूं क्योंकि यह मेरे लिए अधिक उपयोग किया जाता है (मुझे समय से पहले माफ कर दो ... आपको कुछ पात्रों से बचने की आवश्यकता हो सकती है ... मेरी पोस्ट पर टिप्पणी करें और मैं इसे सही कर दूंगा):

टिप्पणियों को बाहर करने के लिए, इस regex का उपयोग करें: नोटिस "?" इसे दबाता है। * इसे लालची बनाने के लिए।

इसी प्रकार, सामग्री टैग खोजने के लिए, उपयोग करें: । *?

इसके अलावा, आप इस बाहर की कोशिश, और प्रत्येक नई पंक्ति चरित्र उपयोग करने में सक्षम मैच के साथ वस्तुओं समूह() हो सकता है:

<content>(.*?(\n))+.*?</content> 

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

अद्यतन 2:

तो यहाँ अजगर कोड है कि काम करने के लिए चाहिए। मैं अभी भी अनिश्चित हूं कि आप सभी न्यूलाइनों को "ढूंढें" से क्या मतलब रखते हैं। क्या आप पूरी लाइन चाहते हैं? या सिर्फ कितनी नई लाइनों की गिनती है। वास्तविक लाइनों पाने के लिए, कोशिश:

['', '<p>', ' haha!', '</p>', ''] 

पहली और आखिरी रिक्त स्ट्रिंग तुरंत पहले <p> और एक सही होने के बाद आने वाले पूर्ववर्ती न्यू लाइन वर्ण से आते हैं:

#!/usr/bin/python 

import re 

def FindContentNewlines(xml_text): 
    # May want to compile these regexes elsewhere, but I do it here for brevity 
    comments = re.compile(r"<!--.*?-->", re.DOTALL) 
    content = re.compile(r"<content>(.*?)</content>", re.DOTALL) 
    newlines = re.compile(r"^(.*?)$", re.MULTILINE|re.DOTALL) 

    # strip comments: this actually may not be reliable for "nested comments" 
    # How does xml handle <!-- <!-- --> -->. I am not sure. But that COULD 
    # be trouble. 
    xml_text = re.sub(comments, "", xml_text) 

    result = [] 
    all_contents = re.findall(content, xml_text) 
    for c in all_contents: 
     result.extend(re.findall(newlines, c)) 

    return result 

if __name__ == "__main__": 
    example = """ 

<!-- This stuff 
ought to be omitted 
<content> 
    omitted 
</content> 
--> 

This stuff is good 
<content> 
<p> 
    haha! 
</p> 
</content> 

This is not found 
""" 
    print FindContentNewlines(example) 

इस कार्यक्रम के परिणाम प्रिंट </p>। यह सब कुछ (अधिकांश भाग के लिए) चाल है। इस कोड के साथ प्रयोग करें और अपनी आवश्यकताओं के लिए इसे परिष्कृत करें। बीच में सामान प्रिंट करें ताकि आप देख सकें कि रेगेक्स क्या मेल खाते हैं और मेल नहीं खाते हैं।

आशा है कि इससे मदद मिलती है :-)।

पीएस - मुझे सभी नए समाचारों को पकड़ने के लिए मेरे पहले अपडेट से मेरे रेगेक्स को आजमाने की बहुत उम्मीद नहीं थी ... अगर आप करते हैं तो मुझे बताएं।

+0

यहां दिए गए रेगेक्स दस्तावेज़ हैं जिन्हें मैंने उपरोक्त कोड लिखा था (यदि आप पाइथन में रेगेक्स से अपरिचित हैं तो यह सहायक होना चाहिए): http://docs.python.org/library/re.html – Tom

+2

@Moayad: btw, अगर टैग घोंसला है तो यह विधि निश्चित रूप से काम नहीं करेगी ... और कोई regex इसे संभालने में सक्षम नहीं होगा। Regexes वास्तव में इस समस्या के लिए उपयुक्त नहीं हैं। – Tom

+0

इस विस्तृत स्पष्टीकरण के लिए बहुत बहुत धन्यवाद :) यह निश्चित रूप से मुझे यह तय करने में मदद करेगा कि उस मुद्दे के साथ क्या करना है। फिर से धन्यवाद! –

4
<content>(?:[^\n]*(\n+))+</content> 
+1

क्वांटिफायर गैर-लालची बनाने के बारे में क्या? ([^ \ n] *? \ N +?) +?

+0

@ कोडबेंडर, आपका कोड < content> टैग के अंदर सब कुछ मेल खाता है, मैं केवल नई लाइनों से मेल खाना चाहता हूं। –

+0

क्वार्ज़, धन्यवाद, लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा हूं, आपका रेगेक्स पहले खुलने वाले टैग < content> और अंतिम समापन टैग < /content> के बीच प्रत्येक चरित्र से मेल खाता है। मैंने इसे थोड़ा स्पष्ट बनाने के लिए उदाहरण अपडेट किया है। –

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