2016-07-20 2 views
0

Я пытаюсь разобрать дамп значения с разделителем вкладок из IMDB. (The actual dump содержит противоречивое количество вкладок на протяжении каждой строки.):Регулярное выражение создает пустой массив, который не должен существовать

$, Claw   "OnCreativity" (2012) [Himself] 

$, Homo   Nykytaiteen museo (1986) [Himself] <25> 
        Suuri illusioni (1985) [Guests] <22> 

$hutter   Battle of the Sexes (2017) (as $hutter Boy) [Bobby Riggs Fan] <10> 
        NVTION: The Star Nation Rapumentary (2016) (as $hutter Boy) [Himself] <1> 
        Secret in Their Eyes (2015) (uncredited) [2002 Dodger Fan] 
        Steve Jobs (2015) (uncredited) [1988 Opera House Patron] 
        Straight Outta Compton (2015) (uncredited) [Club Patron/Dopeman] 

$lim, Bee Moe  Fatherhood 101 (2013) (as Brandon Moore) [Himself - President, Passages] 
        For Thy Love 2 (2009) [Thug 1] 
        Night of the Jackals (2009) (V) [Trooth] 
        "Idle Talk" (2013) (as Brandon Moore) [Himself] 
        "Idle Times" (2012) {(#1.1)} (as Brandon Moore) 

$ly, Yung   Town Bizzness Pt 3 (2014) (V) [Yung $ly] 
        "From Tha Bottom 2 Tha Top" (2016) [Yung $ly] 
        "From Tha Bottom 2 Tha Top" (2016) {T-Pain (#1.2)} [Yung $ly] 

$torm, Cuntry  From the Woods: The Discovery of LYB (????) (as Country $torm) [Himself] 

& Davi, Bruninho Michel na Balada (2011) (V) [Themselves] 
        Michel TelÛ: Sunset (2013) (V) [Themselves] 
        "Programa da Sabrina" (2014) {(2016-01-23)} [Themselves] 

& Dollar Furado, Caio Corsalette "Som Brasil" (2007) {ZezÈ di Camargo & Luciano (#5.7)} [Themselves] 

& Fabiano, CÈsar Menotti Nascemos para Cantar (2010) (TV) [Themselves] 
          Show da Virada (2011) (TV) [Themselves - Performers] 
          Teleton 2010 (2010) (TV) [Themselves] 
          "Altas Horas" (2000) {(2013-06-29)} [Themselves] 
          "Altas Horas" (2000) {(2013-12-14)} [Themselves] 
          "Eliana" (2009) {(2012-10-21)} [Themselves] 
          "Tudo … PossÌvel" (2005) {(2008-04-13)} [Themselves] 
          "TV Xuxa" (2005) {(2013-01-05)} [Themselves] 

Моего код:

package com.mycompany.imdbproject; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.nio.charset.Charset; 
import java.nio.file.Files; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class ActorListParser { 

Charset charset = Charset.forName("ISO-8859-1"); 

BufferedReader reader = null; 

public ActorListParser() { 

    try { 

     this.reader = Files.newBufferedReader(
       new File(System.getProperty("user.home") + ("/IMDBLogs" + "/dataDirectory" + "/acsshort.txt")).toPath(), charset); 

     String line = null; 

     while ((line = reader.readLine()) != null) { 
      String[] lineAsArray = null; 

      Pattern startsWithTab = Pattern.compile("^\t.*$"); 

      Matcher tab = startsWithTab.matcher(line); 

      boolean startsWithTabMatcher = tab.matches(); 

      if (!startsWithTabMatcher) { 

       lineAsArray = line.split("\t"); 

       for (int i = 0;i < lineAsArray.length; i++) { 

        System.out.println("Length: " + lineAsArray.length +", Value:"+ i +" "+ lineAsArray[i]); 
       } 
      }else{ 
      //parse lines that start with a tab (actor's other movies) 
      } 

     } 
    } catch (IOException ex) { 

     Logger.getLogger(ActorListParser.class.getName()).log(Level.SEVERE, null, ex); 

    } 
} 

public static void main(String[] args) { 
    ActorListParser acp = new ActorListParser(); 
} 

} 

Выхода:

Length: 2, Value:0 $, Claw 
Length: 2, Value:1   "OnCreativity" (2012) [Himself] 
Length: 1, Value:0 
Length: 2, Value:0 $, Homo 
Length: 2, Value:1   Nykytaiteen museo (1986) [Himself] <25> 
Length: 1, Value:0  
Length: 2, Value:0 $hutter 
Length: 2, Value:1   Battle of the Sexes (2017) (as $hutter Boy) [Bobby Riggs Fan] <10> 
Length: 1, Value:0 
Length: 2, Value:0 $lim, Bee Moe 
Length: 2, Value:1  Fatherhood 101 (2013) (as Brandon Moore) [Himself - President, Passages] 
Length: 1, Value:0 
Length: 2, Value:0 $ly, Yung 
Length: 2, Value:1  Town Bizzness Pt 3 (2014) (V) [Yung $ly] 
Length: 1, Value:0 
Length: 2, Value:0 $torm, Cuntry 
Length: 2, Value:1  From the Woods: The Discovery of LYB (????) (as Country $torm) [Himself] 
Length: 1, Value:0 
Length: 2, Value:0 & Davi, Bruninho 
Length: 2, Value:1 Michel na Balada (2011) (V) [Themselves] 
Length: 1, Value:0 
Length: 2, Value:0 & Dollar Furado, Caio Corsalette 
Length: 2, Value:1 "Som Brasil" (2007) {Zezà di Camargo & Luciano (#5.7)} [Themselves] 
Length: 1, Value:0 
Length: 2, Value:0 & Fabiano, CÃsar Menotti 
Length: 2, Value:1 Nascemos para Cantar (2010) (TV) [Themselves] 

Как вы можете видеть, я беру первый появление имени автора и анализ имени и фильма из него (для последующего использования на карте). Я получу другие фильмы, связанные с актером в отдельном регулярном выражении.

К сожалению, существует массив длиной 1 без значения, которое продолжает отображаться на моем выходе. Что я делаю неправильно, создавая этот пустой массив?

+0

Две вкладки в строке генерируют это пустое значение, возможно, разбиты на \ t +? –

+0

Я бы предложил 'lineAsArray = line.trim(). Split (" \ t + ");' –

+0

Как вы думаете, что возвращает значение '" ".split (" \ t ")'? * Подсказка: * Это массив из одного значения: пустая строка. См. [Javadoc] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split (java.lang.String,% 20int)): * Если выражение не совпадают с любой частью ввода, тогда полученный в результате массив имеет только один элемент, а именно эту строку **. * – Andreas

ответ

4

У вас есть пустые строки на входе. Они не начинаются с символа табуляции, поэтому они соответствуют оператору if. Затем разбиение пустой строки на что угодно приведет к массиву длиной 1 с пустым строковым элементом. Например, "".split("blah") возвращает массив длиной 1 с пустым строковым элементом в нем. Вот так работает String.split.

Итак, решение состоит в том, чтобы добавить чек на !line.isEmpty().

@Andreas сказал, что лучше в комментарии:

Угу. См. javadoc: Если выражение не соответствует какой-либо части ввода, то результирующий массив имеет только один элемент, а именно эту строку.

+1

Yup. См. [Javadoc] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split (java.lang.String,% 20int)): * Если выражение не совпадают с любой частью ввода, тогда полученный в результате массив имеет только один элемент, а именно эту строку **. * – Andreas

+0

@janos. Вот и все. Спасибо. Я не могу принять ваш ответ до тех пор, пока не пройдет 3 минуты. Я действительно это сделал. – user465001

+0

Или '! Line.trim(). IsEmpty()'. –

Смежные вопросы