2011-07-03 18 views
59

के बीच टेक्स्ट निकालने के लिए जावा रेगेक्स मेरे पास कुछ कस्टम टैग के साथ एक फ़ाइल है और मैं टैग के बीच स्ट्रिंग निकालने के लिए एक नियमित अभिव्यक्ति लिखना चाहता हूं। उदाहरण के लिए यदि मेरा टैग है:टैग

[customtag]String I want to extract[/customtag] 

टैग के बीच केवल स्ट्रिंग निकालने के लिए मैं नियमित अभिव्यक्ति कैसे लिखूं। यह कोड सही दिशा में एक कदम की तरह लगता है:

Pattern p = Pattern.compile("[customtag](.+?)[/customtag]"); 
Matcher m = p.matcher("[customtag]String I want to extract[/customtag]"); 

सुनिश्चित नहीं है कि आगे क्या करना है। कोई विचार? धन्यवाद।

+1

शुरुआत के लिए, आप '[]' वर्ग कोष्ठक जो एक regex में अक्षरों से परे हैं से बचने के लिए की जरूरत है। – ridgerunner

उत्तर

127

आप सही रास्ते पर हैं। मैं मानता हूँ कि नियमित अभिव्यक्ति सर्वश्रेष्ठ उत्तर नहीं हैं

public static void main(String[] args) { 
    final String str = "<tag>apple</tag><b>hello</b><tag>orange</tag><tag>pear</tag>"; 
    System.out.println(Arrays.toString(getTagValues(str).toArray())); // Prints [apple, orange, pear] 
} 

private static final Pattern TAG_REGEX = Pattern.compile("<tag>(.+?)</tag>"); 

private static List<String> getTagValues(final String str) { 
    final List<String> tagValues = new ArrayList<String>(); 
    final Matcher matcher = TAG_REGEX.matcher(str); 
    while (matcher.find()) { 
     tagValues.add(matcher.group(1)); 
    } 
    return tagValues; 
} 

हालांकि, अब तुम सिर्फ वांछित समूह को निकालने के लिए, इस प्रकार की जरूरत है:

final Pattern pattern = Pattern.compile("<tag>(.+?)</tag>"); 
final Matcher matcher = pattern.matcher("<tag>String I want to extract</tag>"); 
matcher.find(); 
System.out.println(matcher.group(1)); // Prints String I want to extract 

आप कई हिट निकालने के लिए चाहते हैं, यह कोशिश यहाँ। मैं उन तत्वों को ढूंढने के लिए XPath का उपयोग करूंगा जिनमें मुझे रूचि है। अधिक जानकारी के लिए The Java XPath API देखें।

+3

बहुत बहुत धन्यवाद, यही वही है जो मुझे चाहिए था। मैं XPaths में देखूंगा, लेकिन अभी के लिए मुझे लगता है कि यह समाधान काम करेगा। मेरे आवेदन बहुत सरल हैं और शायद इस तरह से रहेंगे। एक बार फिर धन्यवाद! – b10hazard

+0

धन्यवाद, यह काम किया !! – Imran

+0

धन्यवाद प्रिय यह वास्तव में मदद की –

1

मैं इस जवाब को उपसर्ग करता हूं "आपको एक्सएमएल को पार्स करने के लिए नियमित अभिव्यक्ति का उपयोग नहीं करना चाहिए - यह केवल किनारे के मामलों में परिणाम देगा जो सही काम नहीं करते हैं, और हमेशा के लिए बढ़ती जटिलता regex इसे ठीक करने का प्रयास करें। "

कहा जा रहा है, तो आप स्ट्रिंग मिलान और समूह आप चाहते हैं हथियाने से आगे बढ़ने के लिए की जरूरत है:

if (m.matches()) 
{ 
    String result = m.group(1); 
    // do something with result 
} 
9

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

jTopas एक अद्भुत टोकनज़र है जो हाथ से पार्सर्स लिखना काफी आसान बनाता है (मैं मानक जावा स्कैनर/आदि .. पुस्तकालयों पर जोरदार सुझाव देता हूं)। आप कार्रवाई में jtopas को देखने के लिए चाहते हैं, here कुछ पारसर्स मैं jTopas का उपयोग कर फ़ाइल की this प्रकार पार्स करने के लिए

आप XML फ़ाइलों को पार्स रहे हैं, तो आप एक XML पार्सर पुस्तकालय का उपयोग करना चाहिए लिखा है।यह अपने आप करना न जब तक आप सिर्फ मनोरंजन के लिए कर रहे हैं, वहाँ plently साबित विकल्पों में से बाहर वहाँ

+0

सुझाव के लिए धन्यवाद। मैंने उन्हें बुकमार्क किया है और मैं निश्चित रूप से भविष्य की परियोजनाओं में इसका उपयोग करने में देखूंगा। अभी के लिए रेगेक्स विधि शायद वह है जिसके साथ मैं जा रहा हूं क्योंकि जिस फ़ाइल में मैं पार्सिंग कर रहा हूं वह बहुत छोटा/सरल है। – b10hazard

2
final Pattern pattern = Pattern.compile("tag\\](.+?)\\[/tag"); 
    final Matcher matcher = pattern.matcher("[tag]String I want to extract[/tag]"); 
    matcher.find(); 
    System.out.println(matcher.group(1)); 
4

एक सामान्य, सरल और एक सा आदिम दृष्टिकोण टैग, विशेषता और मूल्य

Pattern pattern = Pattern.compile("<(\\w+)(+.+)*>((.*))</\\1>"); 
    System.out.println(pattern.matcher("<asd> TEST</asd>").find()); 
    System.out.println(pattern.matcher("<asd TEST</asd>").find()); 
    System.out.println(pattern.matcher("<asd attr='3'> TEST</asd>").find()); 
    System.out.println(pattern.matcher("<asd> <x>TEST<x>asd>").find()); 
    System.out.println("-------"); 
    Matcher matcher = pattern.matcher("<as x> TEST</as>"); 
    if (matcher.find()) { 
     for (int i = 0; i < matcher.groupCount(); i++) { 
      System.out.println(i + ":" + matcher.group(i)); 
     } 
    } 
को खोजने के लिए कर रहे हैं
2

इस प्रयास करें:

Pattern p = Pattern.compile(?<=\\<(any_tag)\\>)(\\s*.*\\s*)(?=\\<\\/(any_tag)\\>); 
Matcher m = p.matcher(anyString); 

उदाहरण के लिए:

String str = "<TR> <TD>1Q Ene</TD> <TD>3.08%</TD> </TR>"; 
Pattern p = Pattern.compile("(?<=\\<TD\\>)(\\s*.*\\s*)(?=\\<\\/TD\\>)"); 
Matcher m = p.matcher(str); 
while(m.find()){ 
    Log.e("Regex"," Regex result: " + m.group())  
} 

आउटपुट:

10 Ene

3.08%

0
String s = "<B><G>Test</G></B><C>Test1</C>"; 

    String pattern ="\\<(.+)\\>([^\\<\\>]+)\\<\\/\\1\\>"; 

     int count = 0; 

     Pattern p = Pattern.compile(pattern); 
     Matcher m = p.matcher(s); 
     while(m.find()) 
     { 
      System.out.println(m.group(2)); 
      count++; 
     }