2015-02-27 17 views
34
sc = new Scanner(new File(dataFile)); 
sc.useDelimiter(",|\r\n"); 

Non capisco come funziona il delimitatore, qualcuno può spiegarlo in parole povere?Come utilizzare un delimitatore nello scanner Java?

+2

qui, ecco come funziona: http: // javatutorialhq.com/java/util/scanner-class-tutorial/usedelimiter-string-pattern-method-example/ – nafas

+1

Come javadoc dice "interrompe il suo input in token usando un pattern delimitatore, che corrisponde per default allo spazio bianco. I token risultanti possono essere convertiti in valori di diverso tipo usando i vari metodi successivi ". Non è chiaro? – ema

+0

@ ema - Presumo che fosse ironico perché è chiaro solo se già "capisci come funziona il delimitatore" e NoMoreErrors NON lo fa. Ad esempio, quale "pattern delimitatore" potrebbe semplicemente non chiarire quello che hai detto, che sicuramente non è sbagliato, solo non utile alla Q. Ma almeno non hai insultato NoMoreErrors come fanno molti, con gioia , Immagino. – DSlomer64

risposta

57

Lo scanner può anche utilizzare delimitatori diversi da spazi vuoti.

Facile esempio dalla Scanner API:

String input = "1 fish 2 fish red fish blue fish"; 

// \\s* means 0 or more repetitions of any whitespace character 
// fish is the pattern to find 
Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); 

System.out.println(s.nextInt()); // prints: 1 
System.out.println(s.nextInt()); // prints: 2 
System.out.println(s.next());  // prints: red 
System.out.println(s.next());  // prints: blue 

// don't forget to close the scanner!! 
s.close(); 

Il punto è capire le espressioni regolari (regex) all'interno del Scanner::useDelimiter. Trova un useDelimiter tutorial here.


Per iniziare con le espressioni regolari here you can find un bel tutorial.

Note

abc… Letters 
123… Digits 
\d  Any Digit 
\D  Any Non-digit character 
.  Any Character 
\.  Period 
[abc] Only a, b, or c 
[^abc] Not a, b, nor c 
[a-z] Characters a to z 
[0-9] Numbers 0 to 9 
\w  Any Alphanumeric character 
\W  Any Non-alphanumeric character 
{m}  m Repetitions 
{m,n} m to n Repetitions 
*  Zero or more repetitions 
+  One or more repetitions 
?  Optional character 
\s  Any Whitespace 
\S  Any Non-whitespace character 
^…$  Starts and ends 
(…)  Capture Group 
(a(bc)) Capture Sub-group 
(.*) Capture all 
(ab|cd) Matches ab or cd 
+0

Cosa fa *? – NoMoreErrors

+0

'*' significa ** Zero o più ripetizioni ** controlla il mio aggiornamento e il link fornito nella risposta;) –

+3

Puoi spiegare questo? '" \\ s * fish \\ s * "' grazie. – UnKnown

7

con scanner i delimitatori di default sono i caratteri di spaziatura.

Ma Scanner può definire dove un token inizia e termina basato su un insieme di delimitatore, goduto possono essere specificati in due modi:

  1. Usando il metodo scanner: useDelimiter(String pattern)
  2. Utilizzo del metodo Scanner: useDelimiter(Pattern pattern) dove Pattern è un'espressione regolare che specifica il set delimitatore.

Così useDelimiter() metodi sono utilizzati per tokenize all'ingresso scanner, e si comportano come StringTokenizer class, dare un'occhiata a questi tutorial per ulteriori informazioni:

E ecco un Example:

public static void main(String[] args) { 

    // Initialize Scanner object 
    Scanner scan = new Scanner("Anna Mills/Female/18"); 
    // initialize the string delimiter 
    scan.useDelimiter("/"); 
    // Printing the tokenized Strings 
    while(scan.hasNext()){ 
     System.out.println(scan.next()); 
    } 
    // closing the scanner stream 
    scan.close(); 
} 

Stampe questa uscita:

Anna Mills 
Female 
18 
2

Per esempio:

String myInput = null; 
Scanner myscan = new Scanner(System.in).useDelimiter("\\n"); 
System.out.println("Enter your input: "); 
myInput = myscan.next(); 
System.out.println(myInput); 

Questo vi permetterà di utilizzare Inserisci come delimitatore.

Così, se si immette:

Hello world (ENTER) 

stamperà 'Ciao mondo'.

+0

buon esempio per implementare useDelimiter() – Yahya

+0

Sì, ma come funziona? A cosa servono DUE backslash? Ma evviva, ora sappiamo come usare Enter come delimitatore. Supponendo che funzioni. – DSlomer64