Reputation: 6242
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.
Upvotes: 12
Views: 17600
Reputation: 141
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
Upvotes: 6
Reputation: 13181
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
Upvotes: 2
Reputation: 892
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)
Upvotes: 19
Reputation: 126902
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.
Upvotes: 11
Reputation: 23796
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]
Upvotes: 8