Pass regex options to PowerShell [regex] type

I capture two groups matched using the regexp code below:

[regex]$regex = "^([0-9]{1,20})(b|kb|mb|gb|tb)$" $matches = $regex.match($minSize) $size=[int64]$matches.Groups[1].Value $unit=$matches.Groups[2].Value 

My problem is I want to make it case-insensitive, and I do not want to use regex modifiers.

I know you can pass regex options in .NET, but I cannot figure out how to do the same with PowerShell.

1

5 Answers

There are overloads of the static [Regex]::Match() method that allow to provide the desired [RegexOptions] programmatically:

# You can combine several options by doing a bitwise or: $options = [Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [Text.RegularExpressions.RegexOptions]::CultureInvariant # or by letting casting do the magic: $options = [Text.RegularExpressions.RegexOptions]'IgnoreCase, CultureInvariant' $match = [regex]::Match($input, $regex, $options) 
1

Try using -match instead. E.g.,

$minSize = "20Gb" $regex = "^([0-9]{1,20})(b|kb|mb|gb|tb)$" $minSize -match $regex #Automatic $Matches variable created $size=[int64]$Matches[1] $unit=$Matches[2] 

Use PowerShell's -match operator instead. By default it is case-insensitive:

$minSize -match '^([0-9]{1,20})(b|kb|mb|gb|tb)$' 

For case-sensitive matches, use -cmatch.

1

After using [regex] type accelerator, Options property is ReadOnly and can't be changed. But you can call a constructor with RegexOptions parameter:

$regex = [System.Text.RegularExpressions.Regex]::new('^([0-9]{1,20})(b|kb|mb|gb|tb)$','IgnoreCase') 

To pass multiple options use bitwise or operator on underlying values:

$regex = [regex]::new('^([0-9]{1,20})(b|kb|mb|gb|tb)$',[System.Text.RegularExpressions.RegexOptions]::Multiline.value__ -bor [System.Text.RegularExpressions.RegexOptions]::IgnoreCase.value__) 

But simple addition seems to work, too:

[System.Text.RegularExpressions.RegexOptions]::Multiline + System.Text.RegularExpressions.RegexOptions]::IgnoreCase 

It would even work when supplied numeric flag (35 = IgnoreCase=1 + MultiLine=2 + IgnorePatternWhitespace=32), altough relying on enum values directly is usually not a best practice:

$regex = [regex]::new('^([0-9]{1,20})(b|kb|mb|gb|tb)$',36) $regex.Options 
1

You can also include mode modifier like (?i) in your regex, like so (cmatch forces case sensitive match):

PS H:\> 'THISISSOMETHING' -cmatch 'something' False PS H:\> 'THISISSOMETHING' -cmatch '(?i)something' True 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like