2009-10-10 11 views
0

Je voudrais spécifier un délimiteur pour un scanner qui sépare un motif, mais ne le supprime pas des jetons. Je ne peux pas sembler faire ce travail, car tout ce qui est identifié par l'expression régulière est également mangé dans le cadre du délimiteur. Aucune suggestion?Utilisation du séparateur Java Scanner

Mon problème spécifique, j'ai fichier qui ressemble à:

text/numbers mix 
numbers 
numbers 
text/numbers mix 
numbers 
numbers 
numbers 
. 
. 

Je voudrais partager à partir du texte/nombres mélange + lignes jusqu'à ce que le prochain texte/mix chiffres. J'ai l'expression régulière pour les identifier, mais comme indiqué, l'utiliser comme délimiteur mange une partie de ce que je veux.

EDIT: ajout de code:

static final String labelRegex="\\s*[^01\\s*]\\w+\\s*"; 
static final Pattern labelPattern = Pattern.compile(labelRegex, Pattern.MULTILINE); 

est le modèle que je l'habitude d'identifier le texte/chiffres bits (je sais que mes numéros lignes contiennent tous les 1/0s séparés par des espaces).

Quand j'initialiser le scanner:

stateScan = new Scanner(new BufferedReader(new FileReader(source))); 
stateScan.useDelimiter(labelPattern); 

qui mange les étiquettes, et laisse juste les lignes. J'ai actuellement une implémentation de travail qui démarre deux scanners sur deux lecteurs de fichiers tamponnés provenant de la même source, l'un se décomposant par états et l'autre par étiquettes. Je voudrais vraiment que ce soit juste une étiquette saisissante + état.

+1

peut vous envoyer le code que vous avez essayé jusqu'à présent? – akf

Répondre

5

Vous pouvez utiliser une perspective positive dans votre regex. Look ahead (et behinds) ne sont pas inclus dans le match, donc ils ne seront pas "mangés" par le scanner. Ce regex va probablement faire ce que vous voulez:

(?=text/numbers) 

Le séparateur sera la chaîne vide juste avant la sous-chaîne text/numbers.

Voici une petite démo:

public class Main { 
    public static void main(String[] args) { 
     String text = "text/numbers mix\n"+ 
       "numbers\n"+ 
       "numbers\n"+ 
       "text/numbers mix\n"+ 
       "numbers\n"+ 
       "numbers\n"+ 
       "numbers"; 
     String regex = "(?=text/numbers)"; 
     Scanner scan = new Scanner(text).useDelimiter(regex); 
     while(scan.hasNext()) { 
      System.out.println("------------------------"); 
      System.out.println(">"+scan.next().trim()+"<"); 
     } 
    } 
} 

qui produit:

------------------------ 
>text/numbers mix 
numbers 
numbers< 
------------------------ 
>text/numbers mix 
numbers 
numbers 
numbers< 
+0

Brillant, merci. – Carl

+0

Pas de problème Carl. –

+0

Ce que je suis finalement allé avec: http://stackoverflow.com/questions/1545022/java-scanner-headache – Carl