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