9

我使用下面的正则表达式代码捕获了两个匹配的组:

[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

我的问题是我想让它不区分大小写,并且我不想使用正则表达式修饰符。

我知道您可以在 .NET 中传递正则表达式选项,但我不知道如何使用 PowerShell 来做同样的事情。

4

5 回答 5

12

[Regex]::Match()允许以[RegexOptions]编程方式提供所需的静态方法的重载:

# 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)
于 2018-09-14T16:55:16.673 回答
7

尝试使用 -match 代替。例如,

$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]
于 2012-10-19T15:25:21.587 回答
6

请改用 PowerShell 的 -match 运算符。默认情况下不区分大小写:

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

对于区分大小写的匹配,请使用 -cmatch。

于 2012-10-19T15:23:42.693 回答
2

使用[regex]类型加速器后,Options 属性为 ReadOnly 且无法更改。但是您可以使用 RegexOptions 参数调用构造函数:

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

要传递多个选项,请对基础值使用按位或运算符:

$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__)

但简单的加法似乎也有效:

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

它甚至可以在提供数字标志 (35 = IgnoreCase=1 + MultiLine=2 + IgnorePatternWhitespace=32) 时工作​​,尽管直接依赖枚举值通常不是最佳实践:

$regex = [regex]::new('^([0-9]{1,20})(b|kb|mb|gb|tb)$',36)
$regex.Options
于 2020-03-24T15:56:39.780 回答
1

您还可以在您的正则表达式中包含模式修饰符,就像(?i)这样(cmatch 强制区分大小写匹配):

PS H:\> 'THISISSOMETHING' -cmatch 'something'
False
PS H:\> 'THISISSOMETHING' -cmatch '(?i)something'
True
于 2016-04-05T12:13:31.530 回答