切换/案例陈述

时间:2015-07-28 19:55:25

标签: regex powershell switch-statement

我有一个名为tabLength的函数,应该返回一个字符串。这是为了在文本文档中进行格式化。

任何人都可以查看我的switch语句,看看为什么我在第6行收到错误。这就是' case' switch语句正在通过。

Function tabLength ( $line ) {
    $lineLength = $line.Length

    switch -regex ( $lineLength ) {
        "[1-4]" { return "`t`t`t" }
        "[5-15]" { return "`t`t" }
        "[16-24]" { return "`t" }
        default { return "`t" }
    }
}

错误讯息:

Invalid regular expression pattern: [5-15].
At C:\Users\name\desktop\nslookup.ps1:52 char:11
+         "[5-15]" <<<<  { return "" }
    + CategoryInfo          : InvalidOperation: ([5-15]:String) [], RuntimeException
    + FullyQualifiedErrorId : InvalidRegularExpression

只会通过[5-15]发送值。

3 个答案:

答案 0 :(得分:6)

[5-15]不是有效的正则表达式字符类。你匹配字符串而不是数字,所以[5-15]基本上是说“匹配'5'到'1'或'5'中的单个字符”,这不是你想要的。

如果删除该中间条件,[16-24]应该会失败。

尝试使用不使用正则表达式的switch语句,但使用脚本块作为条件,以便您可以使用范围进行测试,如下所示:

Function tabLength ( $line ) {
    $lineLength = $line.Length

    switch ( $lineLength ) {
        { 1..4 -contains $_ } { return "`t`t`t" }
        { 5..15 -contains $_ } { return "`t`t" }
        { 16..24 -contains $_ } { return "`t" }
        default { return "`t" }
    }
}

在powershell 3+中,您可以使用-in运算符并颠倒顺序:

Function tabLength ( $line ) {
    $lineLength = $line.Length

    switch ( $lineLength ) {
        { $_ -in  1..4 } { return "`t`t`t" }
        { $_ -in 5..15 } { return "`t`t" }
        { $_ -in 16..24 } { return "`t" }
        default { return "`t" }
    }
}

答案 1 :(得分:4)

@briantist打败了我回答你的直接问题。但是,既然你说你的目标是格式化文本,你可能想要考虑一种完全不同的方法。

PowerShell有format operator-f),允许您以各种方式格式化字符串(以及数字或日期)。例如,如果您想要将文本对齐到30个字符宽的列的右侧(即左边填充的文本),您可以执行以下操作:

Function alignRight ( $line ) {
    '{0,30}' -f $line
}

您也可以将此用于填充在右侧的列。

演示:

PS C:\> '-{0,5}-' -f 'abc'
-  abc-
PS C:\> '-{0,-5}-' -f 'abc'
-abc  -

答案 2 :(得分:2)

正则表达式逐个字符匹配,而不是整数。范围[5-15]对正则表达式引擎没有意义。

尝试添加锚点:

Function tabLength ( $line ) {
    $lineLength = $line.Length

    switch -regex ( $lineLength ) {
        "^[1-4]$" { return "`t`t`t" }
        "^[5-9]$|^1[0-5]$" { return "`t`t" }
        "^1[6-9]$|^2[0-4]$" { return "`t" }
        default { return "`t" }
    }
}