2015-07-28 10 views
5

Ho una funzione denominata tabLength che deve restituire una stringa. Questo è per la formattazione in un documento di testo.Dichiarazione interruttore/caso

Qualcuno potrebbe controllare la mia dichiarazione di switch e vedere perché sto ricevendo un errore sulla linea 6. Questo è il 'caso' che l'istruzione switch sta attraversando.

Function tabLength ($line) { 
    $lineLength = $line.Length 

    switch -regex ($lineLength) { 
     "[1-4]" { return "`t`t`t" } 
     "[5-15]" { return "`t`t" } 
     "[16-24]" { return "`t" } 
     default { return "`t" } 
    } 
} 

messaggio di errore:

Invalid regular expression pattern: [5-15]. 
At C:\Users\name\desktop\nslookup.ps1:52 char:11 
+   "[5-15]" <<<< { return "" } 
    + CategoryInfo   : InvalidOperation: ([5-15]:String) [], RuntimeException 
    + FullyQualifiedErrorId : InvalidRegularExpression 

è solo accadendo a valori inviato attraverso [5-15].

+0

Potrebbe inviare il messaggio di errore esatto? Funziona perfettamente bene qui (PS 4.0 su Win7). –

+0

Sì, mi dispiace per quello – Dominic

risposta

6

[5-15] non è una classe di caratteri regex valida. Stai cercando le stringhe corrispondenti, non i numeri, quindi [5-15] dice in sostanza "abbinare un singolo carattere da '5' a '1' o '5' 'che non è quello che vuoi.

Se si rimuove tale condizione centrale, il [16-24] dovrebbe avere esito negativo allo stesso modo.

Prova una dichiarazione switch che non utilizza espressioni regolari, ma utilizza un blocco di script per le condizioni in modo da poter utilizzare una serie di testare, in questo modo:

Function tabLength ($line) { 
    $lineLength = $line.Length 

    switch ($lineLength) { 
     { 1..4 -contains $_ } { return "`t`t`t" } 
     { 5..15 -contains $_ } { return "`t`t" } 
     { 16..24 -contains $_ } { return "`t" } 
     default { return "`t" } 
    } 
} 

in PowerShell 3+, si potrebbe utilizzare l'operatore -in e invertire l'ordine:

Function tabLength ($line) { 
    $lineLength = $line.Length 

    switch ($lineLength) { 
     { $_ -in 1..4 } { return "`t`t`t" } 
     { $_ -in 5..15 } { return "`t`t" } 
     { $_ -in 16..24 } { return "`t" } 
     default { return "`t" } 
    } 
} 
+0

Bello. Un altro caso in cui Regex semplicemente non ne vale la pena. Mi dimostrerò fuori –

+0

@ MathiasR.Jessen bene questo è dopotutto dopotutto, a volte i limiti dei problemi dati non hanno senso, quindi forse * deve * usare regex per questo, quindi +1 per mostrare il modo regex . – briantist

2

Regex partita carattere per carattere, non interi. L'intervallo [5-15] semplicemente non ha senso per i motori regex.

provare ad aggiungere tasselli:

Function tabLength ($line) { 
    $lineLength = $line.Length 

    switch -regex ($lineLength) { 
     "^[1-4]$" { return "`t`t`t" } 
     "^[5-9]$|^1[0-5]$" { return "`t`t" } 
     "^1[6-9]$|^2[0-4]$" { return "`t" } 
     default { return "`t" } 
    } 
} 
4

@briantist mi hanno picchiato per rispondere alla tua domanda immediata. Tuttavia, poiché dici che il tuo obiettivo è formattare il testo, potresti prendere in considerazione un approccio completamente diverso.

PowerShell ha un format operator (-f) che consente di formattare stringhe (nonché numeri o date) in vari modi. Ad esempio se si desidera che il testo allineato alla destra di una vasta colonna di 30 caratteri (cioè il testo a sinistra imbottite), si potrebbe fare qualcosa di simile:

Function alignRight ($line) { 
    '{0,30}' -f $line 
} 

si potrebbe anche usare questo per una colonna che è imbottito sul destra.

Dimostrazione:

PS C:\>'-{0,5}-' -f 'abc' 
- abc- 
PS C:\>'-{0,-5}-' -f 'abc' 
-abc -
+0

Ottimo lavoro per arrivare a quello che è (probabilmente) il vero problema di root! – briantist