2016-04-01 21 views
0

Film başlıkları, yıl, dil vb. Içeren bir metin dosyası okuyorum. Bu öznitelikleri yakalamaya çalışıyorum.Java'da dağınık bir dizeden metin nasıl alınır?

birkaç ip varsayalım böyle şunlardır:

String s = "A Fatal Inversion" (1992)" 
String d = "(aka "Verhngnisvolles Erbe" (1992)) (Germany)" 
String f = "\"#Yaprava\" (2013) " 
String g = "(aka \"Love Heritage\" (2002)) (International: English title)" 

Nasıl belirtilmişse i adı, yıl, ülke kapmak, hangi tür başlığın tür bundan belirtilmişse ?

Normal ve desenleri kullanmama konusunda çok iyi değilim, ancak belirtilmediğinde ne tür bir özniteliğin nasıl bulunacağını bilmiyorum. Bunu yapıyorum çünkü bir textfile'dan xml oluşturmaya çalışıyorum. Bunun için dtd var ama bu durumda kullanmak için ihtiyacım olduğundan emin değilim.

Düzenleme: İşte denedim.

String pattern; 
    Pattern p = Pattern.compile("\"([^\"]*)\""); 
    Matcher m; 



    Pattern number = Pattern.compile("\\d+"); 
    Matcher num; 

    m = p.matcher(s); 

    num = number.matcher(s); 

    if(m.find()){ 
     System.out.println(m.group(1)); 
    } 

    if(num.find()){ 
     System.out.println(num.group(0)); 
    } 
+1

ur denemelerini yapın. –

+1

veri çok dağınık ve tutarsız. Veriler arttıkça, tutarsızlık olacak ve veriyi yakalamak zorlaşacaktır. – rock321987

+0

@AvinashRaj check edit. teşekkürler – user2775042

cevap

1

İlk olarak bu yıl oldukça tutarlı göründüğünden ayıklamanızı öneririm. Sonra ülkeyi çıkarırdım (eğer varsa) ve geri kalanı ise başlıktır.

Ülkeleri ayıklamak için, bilinen ülkeler adlarıyla normal ifade desenini kodlamanızı öneririz. Bazılarının, oldukça tutarsız göründükleri şeyleri belirlemek için tekrarlamaları gerekebilir.

biraz çirkin Bu kod (ancak o zaman veridir!):

public class Extraction { 
    public final String original; 
    public String year = ""; 
    public String title = ""; 
    public String country = ""; 

    private String remaining; 

    public Extraction(String s) { 
     this.original = s; 
     this.remaining = s; 
     extractBracketedYear(); 
     extractBracketedCountry(); 
     this.title = remaining; 
    } 

    private void extractBracketedYear() { 
     Matcher matcher = Pattern.compile(" ?\\(([0-9]+)\\) ?").matcher(remaining); 
     StringBuffer sb = new StringBuffer(); 
     while (matcher.find()) { 
      this.year = matcher.group(1); 
      matcher.appendReplacement(sb, ""); 
     } 
     matcher.appendTail(sb); 
     remaining = sb.toString(); 
    } 

    private void extractBracketedCountry() { 
     Matcher matcher = Pattern.compile("\\((Germany|International: English.*?)\\)").matcher(remaining); 
     StringBuffer sb = new StringBuffer(); 
     while (matcher.find()) { 
      this.country = matcher.group(1); 
      matcher.appendReplacement(sb, ""); 
     } 
     matcher.appendTail(sb); 
     remaining = sb.toString(); 
    } 

    public static void main(String... args) { 

     for (String s : new String[] { 
       "A Fatal Inversion (1992)", 
       "(aka \"Verhngnisvolles Erbe\" (1992)) (Germany)", 
       "\"#Yaprava\" (2013) ", 
       "(aka \"Love Heritage\" (2002)) (International: English title)"}) { 

      Extraction extraction = new Extraction(s); 
      System.out.println("title = " + extraction.title); 
      System.out.println("country = " + extraction.country); 
      System.out.println("year = " + extraction.year); 
      System.out.println(); 
     } 
    } 

} 

üretir: Bu verilere sahibiz sonra, (daha fazla manipüle edebilir

title = A Fatal Inversion 
country = 
year = 1992 

title = (aka "Verhngnisvolles Erbe")  
country = Germany 
year = 1992 

title = "#Yaprava" 
country = 
year = 2013 

title = (aka "Love Heritage") 
country = International: English title 
year = 2002 

örneğin "Uluslararası: İngilizce başlık" -> "İngiltere").

+0

Merhaba, Cevabınız için teşekkürler. Ancak regex ayarlamak mümkündür bu yüzden ülke bir dize "aka \" Teatre catal amb Manel Fuentes \ "(2004)) \t (İspanya: Katalanca başlığı) (çalışma başlığı)" regex'in bir sözcüğün etrafına sarıldığı an, sadece sadece İspanya'nın parantez içinde olmasıyla eşleşir. Bunu nasıl düzeltirim? – user2775042

+0

Yığın Taşması'nın çalışma şekli, bunu yeni bir soru olarak sormanız gerekir. Belirli bir problemi ve ne denediğinizi daraltmaya çalışın. –

İlgili konular