如何查看RegexOptions枚举中可用的选项?

时间:2018-01-20 18:50:10

标签: regex powershell enums

如何使用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以及上述代码中使用它的语法是什么?

2 个答案:

答案 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)