Switch/case语句

5
我有一个名为tabLength的函数,它应该返回一个字符串。这是为了在文本文档中进行格式化。
请问有人可以查看我的switch语句并看看为什么我在第6行出错。这就是switch语句正在通过的“case”。
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]发送的值才会出现这种情况。


你能发一下具体的错误信息吗?这里(在Win7上使用PS 4.0)完全正常。 - Mathias R. Jessen
对不起,关于那个我很抱歉。 - Dominic
3个回答

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" }
    }
}

不错。又是一个正则表达式根本不值得的情况。我自己走了。 - Mathias R. Jessen
@MathiasR.Jessen 嗯,毕竟这是作业,有时候给出的问题范围并没有意义,所以也许他必须使用正则表达式来解决这个问题,所以对于展示正则表达式的方法加一分。 - briantist

4

@briantist 在回答您的问题时已经抢先一步了。但是,由于您的目标是格式化文本,您可能需要考虑完全不同的方法。

PowerShell有一个格式运算符-f),可以让您以各种方式格式化字符串(以及数字或日期)。例如,如果您想要将文本对齐到30个字符宽的列的右侧(即左填充文本),您可以这样做:

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

你也可以将此用于右侧有填充的列。
演示:
PS C:\> '-{0,5}-' -f 'abc'
-  abc-
PS C:\> '-{0,-5}-' -f 'abc'
-abc  -

做得好,找到了(可能是)实际根本问题! - briantist

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" }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接