如何使用powershell脚本中的此函数来使用-cmatch
运算符执行不区分大小写的匹配:
static System.Text.RegularExpressions.Match Match(
string input,
string pattern,
System.Text.RegularExpressions.RegexOptions options)
我正在考虑这样的事情:
PS> $input = "one two three"
PS> $m = [regex]::Match($input, "one", ????)
我有一个问题的部分是上面的????
。
如何看待PowerShell提示符中提供的System.Text.RegularExpressions.RegexOptions
以及上述代码中使用它的语法是什么?
答案 0 :(得分:6)
轻松"作弊"查看枚举中可用选项的方法是在PowerShell提示符或ISE中使用制表符完成。从[System.Text.RegularExpressions.RegexOptions]::
开始,然后使用 CTRL SPACE (或 TAB )查看选项。
编程方式,因为RegexOptions
是一个枚举,是这样的:
[System.Enum]::GetNames([System.Text.RegularExpressions.RegexOptions])
当你需要在PowerShell中传递枚举值时,你可以传递长格式的完全限定的枚举值(这是我的偏好):
[System.Text.RegularExpressions.RegexOptions]::IgnoreCase
或者您可以直接传递数值(1
),也可以传递字符串,它将与枚举的文字值'IgnoreCase'
匹配。
对于您的实际问题:使用[regex]::Match()
已区分大小写。您只需将[System.Text.RegularExpressions.RegexOptions]::None
传递给您的通话(或0
或'None'
)。
如果您希望它不区分大小写,那么您可以使用上面的IgnoreCase
枚举值。
因为这种类型的枚举是一系列位标志,所以你可以将它们组合起来。为此,您可以使用-bor
(按位或,或二进制或)运算符:
$myOptions = [System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor
[System.Text.RegularExpressions.RegexOptions]::SingleLine -bor
[System.Text.RegularExpressions.RegexOptions]::IgnorePatternWhitespace
但是,PowerShell方便地将字符串强制转换为枚举并不会停留在单个值上。正如mklement0提醒我的那样,您可以用逗号分隔字符串中的枚举名称,PowerShell将仍然正确地解析它。
因此,当您需要传递'IgnoreCase, SingleLine, IgnorePatternWhitespace'
时,可以直接使用RegexOptions
之类的字符串。你也可以预先投射它:
$myOptions = 'IgnoreCase, SingleLine, IgnorePatternWhitespace' -as [System.Text.RegularExpressions.RegexOptions]
$myOptions = [System.Text.RegularExpressions.RegexOptions]'IgnoreCase, SingleLine, IgnorePatternWhitespace'
答案 1 :(得分:1)
简化braintist回答一下使用命名空间:
PS> using namespace System.Text.RegularExpressions
PS> [Enum]::GetNames([RegexOptions])
None
IgnoreCase
Multiline
ExplicitCapture
Compiled
Singleline
IgnorePatternWhitespace
RightToLeft
ECMAScript
CultureInvariant
PS> $input = "one two three"
PS> $m = [regex]::Match($input, "one", [RegexOptions]::IgnoreCase)