2014-10-07 3 views
0

я получил текст из BufferedReader, и мне нужно, чтобы получить конкретную строку после определенной строкиJava Как найти определенную строку после определенной строки?

Это текст, например:

<img src="https://example.com/image1.jpg"> 
<img src="https://example.com/image2.jpg"> 
<img src="https://example.com/image3.jpg"> 
<img src="https://example.com/image4.jpg"> 
<all> 
<img src="https://example.com/image9.jpg"> 
<img src="https://example.com/image11.jpg"> 
<img src="https://example.com/image15.jpg"> 

пример с LineBreak

<img src="https://example.com/image1.jpg"> 
<img src="https://example.com/image2.jpg"> 
<img src="https://example.com/image3.jpg"> 
<img src="https://example.com/image4.jpg"> 
<all> 

<img src="https://example.com/image9.jpg"> 
<img src="https://example.com/image11.jpg"> 
<img src="https://example.com/image15.jpg"> 

пример с другим персоналом

<img src="https://example.com/image1.jpg"> 
<img src="https://example.com/image2.jpg"> 
<img src="https://example.com/image3.jpg"> 
<img src="https://example.com/image4.jpg"> 
<all> 
UTUYGBLK 
<img src="https://example.com/image9.jpg"> 
<img src="https://example.com/image11.jpg"> 
<img src="https://example.com/image15.jpg"> 

I o nly хотите строку img src после «все», которая контур и конец цикла после этого. номер изображения является случайным, поэтому я не могу ударить по любому из них.

В настоящее время мой код выглядит следующим образом.

while ((line = rd.readLine()) != null) { 

    if (line.contains("all")) {  
    line = rd.readLine(); 
    System.out.println(line); 
    } 
} 

, но если есть перевод строка после «всех» я получу возвращения нулевого ... или смешного UTUYGBLK характера

+1

Установите флаг, если вы встретите '' все "и продолжаете цикл.Затем верните первую строку, для которой '! Line.trim(). IsEmpty()'. (BTW, ваш текущий код не должен возвращать «null», а пустую строку, если следующая строка пуста. «Null» будет возвращаться только в том случае, если последняя строка в файле сопоставлена, и в этом случае нет «строки после нее», .) – 5gon12eder

ответ

2

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

boolean loop = true; 
// global loop 
while ((line = rd.readLine()) != null && loop) { 
    // line with "all" in it is found? 
    if(line.contains("all")) {  
    // Continue going through the input until end of input 
    while((line = rd.readLine()) != null && loop) { 
     // When the line is not empty you have found the line after all! 
     if(!line.isEmpty()) { 
     System.out.println(line); 
     // to stop the loops 
     loop = false; 
     } 
    } 
    } 
} 
+0

Линия выражения! = Null всегда будет true, потому что (line = ...)! = Null является частью условия цикла. – UniversE

+0

Вы правы, отредактированы. – Juru

1

Затем просто пропустите пустые строки.

while ((line = rd.readLine()) != null) { 

    if (line.contains("all")) { 
     while ((line = rd.readLine()) != null && line.trim().isEmpty()); 
     System.out.println(line); 
     break; 
    } 
} 
+0

Не закрывает конец входного отверстия. – Juru

+1

@ Juru Теперь он делает. Я думал, что по крайней мере одна действительная строка по определению - но мы никогда не сможем узнать;) – UniversE

+0

Я никогда не пытаюсь предположить слишком много :). Этот образ мышления возвращался ко мне за мести много раз. – Juru

0
String line = ""; 
while (!line.contains("all")) 
    line = rd.readLine(); 
line = rd.readLine(); 
while ("".equals(line.trim())) 
    line = rd.readLine(); 
return line; 
//or System.out.println(line); 

Это будет:

  1. Установите line в пустую строку.
  2. Прочитайте строки до тех пор, пока не получите один, содержащий all.
  3. Прочитать следующую строку.
  4. Прочитайте строки, пока не получите непустую.
  5. Вернуть последнее, что он прочитал.

Это работает, исходя из предположения, что на самом деле будет строка, содержащая all, и что на самом деле там будет не пустое место.

+0

Почему downvote? –

-1

Вы можете использовать метод

line.isEmpty() 

обрабатывать тот случай

+0

Так что я могу поправляться - почему голос? – Puttzy

0

Вы можете перейти во вторую петлю, чтобы проверить нули.

while ((line = rd.readLine()) != null) { 

     if (line.contains("all")) {  
      while ((line = rd.readLine()) == null || line.isEmpty()) { 
        //keep looping while line is null 

        //check if it is no longer ready to avoid infinite loop 
        if (!rd.ready()) {break;} 
      } 
      //line should not be null here 
      System.out.println(line); 
     } 

Или что-то, что влияет.

+1

Бесконечный цикл, когда вы находитесь в конце ввода. – Juru

+0

@ Juru спасибо за головы. Как насчет сейчас? Я добавил проверку(). –

+0

Лучше, но у вас также может быть пустая строка вместо нуля, нуль указывает конец ввода, а пустая строка будет означать пустую строку. – Juru

0

Если вы используете contains(), если у вас есть изображение с именем, содержащим «все», у вас будут неправильные результаты. Лучше использовать equals() после обрезки линии. Поэтому код будет выглядеть так:

while ((line = rd.readLine()) != null) { 
    if (line.trim().equals("<all>")) { 
     while ((line = rd.readLine()).isEmpty()); 
     System.out.println(line); 
     break; 
    } 
} 
Смежные вопросы