2010-10-16 4 views
0

Я хотел бы узнать, как распечатать определенную строку из входного файла с помощью сканера. Для строки, которую нужно напечатать, строка должна начинаться с * звезды, а строка должна быть окружена кавычками и быть следующим токеном и в той же строке, что и звездочка, игнорируя, конечно, пробел.Справка класса сканера Java

Пример ввода текста файла: "test.txt"

это тест

* звезда "variableX"

более

тестирование

* звезда « переменной у

и еще более

тестирование

* Звездочка рядом «variableZ»

На основании этого входного образца текста на выходе должен быть только.

"variableX"

Вот часть моего кода:

Scanner scanner = new Scanner (new File ("test.txt")); 

    while (scanner.hasNextLine()){ 

     if(scanner.hasNext("*star")) { 
      scanner.next(); 

      if(scanner.hasNext()){ 
       String test = scanner.next(); 
       System.out.println(test); 
      } 

Но это не хватает некоторых ключевых вещей. Помощь очень ценится!

ответ

1
while (scanner.hasNextLine()){ 

     String line = scanner.nextLine(); 

     if(line.startsWith("*star")){ 

     String[] split= line.split("\\s+"); //Split the string where there is whitespace 

     //No whitespace after *star 
     if ((split.length<2)){ 
     System.exit(0); 
     } 

     String file= split[1]; 
     String star=split[0]; 

     String file1=file.trim(); //Removes whitespace 

     if(file1.startsWith("\"")&&(file1.endsWith("\""))){ 

     System.out.println(file1); 
     } 

    } 
-1

Это делает трюк

public static void main(String[] args) throws FileNotFoundException 
    { 
     Scanner scanner = new Scanner (new File ("c:\\test.txt")); 

     while (scanner.hasNextLine()){ 
      if(scanner.hasNext(Pattern.compile("\\*star"))) { 
       scanner.next(); 
       System.out.println(scanner.nextLine()); 
       return; 
      } 
      else 
       scanner.nextLine(); 
     } 
    } 

Edit: Котировка часть отсутствовала в ответ, не забудьте положить его, как я получил выход даже без него, но здесь это более надежное решение:

Scanner scanner = new Scanner (new File ("c:\\new.txt")); 

     while (scanner.hasNextLine()){ 
      if(scanner.hasNext(Pattern.compile("\\*star"))) { 
       scanner.next(); 
       String s = scanner.nextLine(); 
       Matcher m = Pattern.compile("\".+\"").matcher(s); 
       if(m.find()) 
       { 
        System.out.println(m.group()); 
        return; 
       } 
      } 
      else 
       scanner.nextLine(); 
     } 
+0

Это один не может лишить ведущую * звезды и «» кавычки, как в примере вывода ... – andersoj

+0

вы действительно попытаться запустить его на входе?Он наверняка получил правильный ответ для меня даже без кода котировки, который я только что добавил; но я согласен, что он должен был быть там. Предыдущий код наверняка лишен ведущей * звезды (когда линия начиналась с нее, как упоминалось), и цитаты не нужно удалять, как показано на выходе. –

2
package so3947761; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main { 
    private static final Pattern RELEVANT_LINE_PATTERN = 
     Pattern.compile("^\\*star\\s+\"(.*)\"$"); 

    public static void main(String[] args) throws FileNotFoundException { 
    Scanner scanner = new Scanner(new File("test.txt")); 

    while (scanner.hasNextLine()) { 
     String line = scanner.nextLine(); 

     Matcher m = RELEVANT_LINE_PATTERN.matcher(line); 
     if (m.matches()) { 
     String data = m.group(1); 

     System.out.println(data); 
     } 
    } 
    } 
} 

Некоторые замечания:

  • Я использую сканер только для разделения ввода на строки.
  • Реальная работа выполняется с помощью шаблона регулярного выражения, который содержит все требования, которые вы указали.
  • Если вы хотите еще раз проанализировать текст в кавычках (например, чтобы заменить \n на новую строку), это не может быть выполнено с помощью обычного выражения, поэтому вам нужно явно определить, какие последовательности заменить.
  • Возможно, вы захотите добавить \\s* справа от ^ (начало строки) и слева от $ (конец строки), если вы хотите разрешить пробелы в этих местах.
+0

Это регулярное выражение кажется хорошим, но не работает для меня для ввода, заданного в вопросе –

+0

Это странно, потому что я тестировал его именно с помощью ввода, который вы дали. Ну, почти, я удалил ведущее белое пространство. Поэтому вы, вероятно, должны следовать рекомендациям в четвертом пункте выше. –

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