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

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

David Miller

David Miller

Executive Financial & Market Analyst

David Miller brings 15 years of experience in global economics, personal finance strategy, and market dynamics. He specializes in turning complex economic trends into actionable insights for everyday readers.

Share this article
Twitter Facebook Pinterest