Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Switch/case statement

I have a function called tabLength that should return a string. This is for formatting in a text document.

Could anyone check out my switch statement and see why I am getting an error on line 6. That is the 'case' that the switch statement is going through.

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" }
    }
}

Error Message:

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

It is only happening to values being sent through [5-15].

like image 344
Dominic Avatar asked Jul 28 '15 19:07

Dominic


People also ask

What is the statement of switch case?

Switch case statement evaluates a given expression and based on the evaluated value(matching a certain condition), it executes the statements associated with it. Basically, it is used to perform different actions based on different conditions(cases).

What is the syntax of switch statement?

The syntax of the switch statement is: statement(s); break; case constant 2: statement(s);

How does a switch statement work?

A switch works with the byte , short , char , and int primitive data types. It also works with enumerated types (discussed in Enum Types), the String class, and a few special classes that wrap certain primitive types: Character , Byte , Short , and Integer (discussed in Numbers and Strings).


1 Answers

[5-15] is not a valid regex character class. You are matching strings, not numbers, so [5-15] essentially says "match a single character from '5' through '1', or '5'" which is not what you want.

If you remove that middle condition, the [16-24] should fail similarly.

Try a switch statement that doesn't use regex, but uses a script block for conditions so you can use a range to test, like this:

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+, you could use the -in operator and reverse the order:

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" }
    }
}
like image 115
briantist Avatar answered Sep 28 '22 09:09

briantist