Home > OS >  Switch statement with RegEx - having trouble getting a switch statement not to match if string has a
Switch statement with RegEx - having trouble getting a switch statement not to match if string has a

Time:12-22

Lets say I have switch statement like so:

$NewName = "test.psd"
switch -RegEX ($NewName) {
    "^\..*" { #if string starts with "." it means only change extension
                'Entry Starts with a "."'
        }
   ".*\..*" { # "." is in the middle , change both basename and extension
               'Entry does not start  with a "."'
    }
   "[^.]" { # if no "." at all, it means only change base name
            'No "." present'
    }
}

The first and second condidtions work as expected, but the last one always triggers. It will trigger against:

  • $NewName = "test.psd"
  • $NewName = ".psd"
  • $NewName = "test"

Doesnt regex "[^.]" mean if there is a dot, dont match. Essentially only trigger in the absence of a dot.

My expected outcome is for the last statement to only trigger if there is not dot present.

Any help on this, would be wellcome.

CodePudding user response:

That would only work if "." were the only character. All the other characters would match it. You would have to repeat that pattern for every character on the line. See also Regex - Does not contain certain Characters

'a.' -match '^[^.] $'

False


'ab' -match '^[^.] $'

True

CodePudding user response:

The dot is a special character in regular expressions, and needs to be escaped when you want to use a literal dot. Try "[^\.]" for the regular expression in the third case.

  • Related