2009-07-03 25 views
14

से एक विशेषता प्राप्त करने के लिए नियमित अभिव्यक्ति मैं नियमित अभिव्यक्ति की तलाश में हूं जो मुझे जावा में निम्नलिखित HTML स्निपेट से स्रोत (केस असंवेदनशील) टैग प्राप्त कर सकता है।एचटीएमएल टैग

<html><img src="kk.gif" alt="text"/></html> 
<html><img src='kk.gif' alt="text"/></html> 
<html><img src = "kk.gif" alt="text"/></html> 

उत्तर

24

एक संभावना:

String imgRegex = "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>"; 

एक संभावना है (यदि केस-insensitively मिलान)। यह एक गड़बड़ है, और जानबूझकर उस मामले को अनदेखा करता है जहां उद्धरणों का उपयोग नहीं किया जाता है। स्ट्रिंग के बारे में चिंता किए बिना यह प्रतिनिधित्व करने के लिए निकल जाता है:

<img[^>]+src\s*=\s*['"]([^'"]+)['"][^>]*> 

यह मेल खाता है:

  • <img
  • एक या अधिक वर्ण हैं कि नहीं > (अर्थातसंभव अन्य विशेषताओं)
  • src
  • वैकल्पिक खाली स्थान के
  • =
  • वैकल्पिक खाली स्थान के
  • या ' की सीमांकक "
  • छवि स्रोत (जो एक एकल या डबल उद्धरण शामिल न हों)
  • शुरू करने
  • समाप्ति delimiter
  • हालांकि अभिव्यक्ति यहाँ बंद कर सकते हैं, मैं तो कहा: कि > (अधिक संभव विशेषताएँ) नहीं हैं
    • शून्य या अधिक वर्ण
    • > टैग

बंद करने के लिए नोट्स:

  • आप src= शामिल करने के लिए और साथ ही चाहते हैं, खुला ब्रैकेट आगे :-)
  • इस बायीं तरफ चली सीमांकक संतुलन के बारे में परवाह नहीं करता है या सीमांकक के बिना विशेषता मान, और यह भी बुरी तरह से गठन विशेषताओं पर गला घोंटना सकता है (जैसे गुणों के रूप में जिसमें > या छवि स्रोत शामिल हैं जिनमें ' या " शामिल हैं) शामिल हैं।
  • इस तरह के नियमित अभिव्यक्तियों के साथ एचटीएमएल को पार्स करना गैर-तुच्छ है, और सबसे अच्छा एक त्वरित हैक जो अधिकांश मामलों में काम करता है।
+0

धन्यवाद; यह "स्ट्रिंग के लिए मैच देता है। क्या यह अभिव्यक्ति जी में बदल सकती है मुझे केवल "kk.txt"; उम्मीद है कि मैं बहुत ज्यादा नहीं पूछ रहा हूं;) –

+0

पहला सबमिशन आपको जो चाहिए वो वापस कर देना चाहिए। समूह तक पहुंचने के लिए http://java.sun.com/docs/books/tutorial/essential/regex/groups.html देखें। आप अनिवार्य रूप से '1'' तर्क के साथ अपने मिलान परिणाम पर 'समूह() 'विधि का उपयोग करना चाहते हैं। – DMI

+0

कब्जे वाले उपसमूह को कैसे प्राप्त करें इस पर एक उदाहरण के लिए उपरोक्त क्लीटस से कोड देखें - आप केवल 'समूह() 'के लिए तर्क चाहते हैं। – DMI

17

यह प्रश्न यहां बहुत कुछ आता है।

रेगुलर एक्सप्रेशन एक बुरा इस समस्या से निपटने में तरीका है। अपने आप को एक पक्ष बनाओ और किसी प्रकार का एक HTML पार्सर का उपयोग करें।

Regexes HTML को पार्स करने के लिए flaky हैं। आप एक जटिल अभिव्यक्ति के साथ समाप्त हो जाएंगे जो कुछ कोने मामलों में अप्रत्याशित रूप से व्यवहार करेगा जो अन्यथा होता है।

संपादित करें: वहाँ any number of Java HTML parsers सारे हैं

Pattern p = Pattern.compile("src\\s*=\\s*([\\"'])?([^ \\"']*)"); 
Matcher m = p.matcher(str); 
if (m.find()) { 
    String src = m.group(2); 
} 

और:हैं अपने HTML तो सरल है।

+0

यहां तक ​​कि xpath इस * श्वास * – annakata

+2

के लिए बेहतर होगा यह कहकर कि एक pa से लिंक किए बिना rser वास्तव में उपयोगी नहीं है। – wds

+1

मैं सहमत हूं; लेकिन मेरे पास डेटा में एक छोटा सा स्निपेट है और प्रत्येक डेटा तत्व के लिए लूप में है और यह सुनिश्चित नहीं है कि पार्सर लोडिंग और मान प्राप्त करने से प्रदर्शन बिंदु –

0

आपका मतलब img-tag की src-विशेषता है? उस मामले में आप निम्नलिखित के साथ जा सकते हैं:

<[Ii][Mm][Gg]\\s*([Ss][Rr][Cc]\\s*=\\s*[\"'].*?[\"']) 

यही काम करना चाहिए। अभिव्यक्ति src = '...' parantheses में है, इसलिए यह एक matcher-group है और इसे अलग से संसाधित किया जा सकता है।

+0

हां; मुझे छवि से स्रोत विशेषता चाहिए; लेकिन जावा में यह अभिव्यक्ति संकलन; क्या आप इसे सत्यापित कर सकते हैं। –

+1

यह तब तक काम करेगा जब तक कोई व्यक्ति विशेषता मान (src = 'foo') को सीमित करने के लिए डबल कोट्स के बजाय एस्ट्रोफ़ेस का उपयोग नहीं करता है। इसके अलावा, अगर आपका आईएमजी टैग अन्य गुणों में था तो आपका दृष्टिकोण असफल हो जाएगा। इसमें शामिल जटिलता काफी अधिक है, हालांकि आप अधिकतर मामलों को एक अच्छे रेगेक्स के साथ प्राप्त कर सकते हैं। मेरे पास एक आसान नहीं है। –

+1

उत्तर के लिए धन्यवाद; यह regEx संकलन जावा में निम्नलिखित त्रुटि के साथ विफल रहा है। java.util.regex.PatternSyntaxException: बंद न किया गया gro के पास पी सूचकांक 43 <[Ii] [Mm] [Gg] \ s * ([ss] [आर आर] [cc] \ s * = \ * \ s " ।? * \ " ^ –

1

यह जवाब है, क्योंकि यह बहुत देर हो चुकी

प्रतिलिपि बनाई जा रही कि्लिटस के अपने जवाब में संशोधन और उनका पैरामीटर में Pattern.compile मेरे लिए काम किया पारित कर दिया के रूप में संशोधित स्ट्रिंग src\\s*=\\s*([\"'])?([^\"']*) गुजर त्रुटि और से पता चला है,

गूगल खोजकर्ताओं के लिए है यहाँ है पूर्ण उदाहरण

String htmlString = "<div class=\"current\"><img src=\"img/HomePageImages/Paris.jpg\"></div>"; //Sample HTML 

    String ptr= "src\\s*=\\s*([\"'])?([^\"']*)"; 
    Pattern p = Pattern.compile(ptr); 
    Matcher m = p.matcher(htmlString); 
    if (m.find()) { 
     String src = m.group(2); //Result 
    } 
संबंधित मुद्दे