Domanda

Mi piacerebbe specificare un delimitatore per uno scanner che si divide su qualche modello, ma non rimuove quel modello dai gettoni. Non riesco a fare questo lavoro, come tutto ciò che viene identificato dal regex anche viene mangiato come parte del delimitatore. Qualche suggerimento?

Il mio problema specifico, ho il file che assomiglia a:

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

Mi piacerebbe dividere fuori dal testo / miscela di numeri + le righe fino a quando il testo accanto miscela di numeri /. Ho la regex per identificarli, ma come detto, usando che come delimitatore mangia parte di ciò che voglio.

EDIT: Codice di più:

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

è il modello che ho usato per identificare il bit di testo / numeri (conosco i miei numeri righe contengono tutti i 1/0 s separati da spazi).

Quando ho inizializzare lo scanner:

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

che mangia le etichette, e lascia solo le righe. Al momento ho un'implementazione di lavoro che inizia due scanner su due lettori di file tamponati dalla stessa fonte, una divisione degli Stati e l'altra da etichette. Mi piacerebbe molto che fosse un solo afferrando etichetta + stato.

È stato utile?

Soluzione

È possibile utilizzare uno sguardo positivo avanti nel vostro regex. Guardate aheads (e sederi) non sono inclusi nella partita, in modo da non essere "mangiati" da parte dello scanner. Questa espressione regolare sarà probabilmente fare quello che vuoi:

(?=text/numbers)

Il delimitatore sarà la stringa vuota destra prima del text/numbers sub-stringa.

Ecco una piccola demo:

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()+"<");
        }
    }
}

che produce:

------------------------
>text/numbers mix
numbers
numbers<
------------------------
>text/numbers mix
numbers
numbers
numbers<
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top