2010-10-16 4 views
0

Je voudrais savoir comment imprimer une certaine chaîne à partir d'un fichier d'entrée à l'aide d'un scanner. Pour que la chaîne soit imprimée, la ligne doit commencer par * star et la chaîne doit être entourée de guillemets, et être le prochain jeton et sur la même ligne que * star en ignorant bien entendu l'espace blanc.Aide de la classe Java Scanner

fichier texte d'entrée Exemple: "test.txt"

ceci est un test

* étoiles "variableX"

plus de tests

* étoiles « variableY

beaucoup plus

test

* étoiles suivante « variableZ »

Basé sur ce texte d'entrée exemple la sortie devrait être seulement.

"variableX"

Voici une partie de mon code:

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); 
      } 

Mais il manque quelques éléments clés. L'aide est très appréciée!

Répondre

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

Cela fait le tour

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: La partie citation avait disparu dans la réponse, ne se souvenaient pas de le mettre comme je suis la sortie même sans elle, mais ici, il est un plus solution robuste:

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

Celui-ci ne parvient pas à dépouiller le premier * étoiles et « » guillemets, comme dans la sortie exemple ... – andersoj

+0

avez-vous vraiment essayer de l'exécuter sur l'entrée?Il a certainement obtenu la bonne réponse pour moi même sans le code de citation que je viens d'ajouter; mais je suis d'accord, il aurait dû être là. Le code précédent a été dépouillé de l'étoile * principale (lorsqu'une ligne a commencé avec, comme mentionné) et les citations ne doivent pas être supprimées, comme indiqué dans la sortie. –

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); 
     } 
    } 
    } 
} 

Quelques remarques:

  • Je n'utilise le scanner que pour diviser l'entrée en lignes.
  • Le travail réel est effectué par le modèle d'expression régulière, qui contient toutes les exigences que vous avez indiquées.
  • Si vous souhaitez analyser le texte entre guillemets (par exemple pour remplacer \n avec un saut de ligne), cela ne peut pas être fait par l'expression régulière, vous devez donc définir explicitement les séquences à remplacer.
  • Vous pouvez ajouter \\s* à droite du ^ (début de la ligne) et à gauche du $ (fin de la ligne) si vous souhaitez autoriser les espaces à ces endroits.
+0

Cette regex semble être bonne, mais n'a pas fonctionné pour moi pour l'entrée donnée dans la question –

+0

C'est bizarre parce que je l'ai testé avec exactement l'entrée que vous avez donnée. Eh bien, presque, j'ai enlevé le premier espace blanc. Donc, vous devriez probablement suivre les conseils du quatrième point ci-dessus. –