Передать параметры регулярного выражения в тип powershell [regex]

Я захватил 2 группы, соответствующие приведенному ниже коду регулярного выражения:

[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 ответа

Решение

Попробуйте вместо этого использовать -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]

Есть перегрузки статического [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)

Используйте оператор PowerShell -match. По умолчанию он не учитывает регистр:

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

Для чувствительных к регистру совпадений используйте -cmatch.

Я знаю, что это действительно старый, но вы также можете включить (?i) в вашем регулярном выражении, вот так (cmatch заставляет совпадать с учетом регистра):

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

После использования [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
Другие вопросы по тегам