2015-07-28 19 views
5

Tôi có chức năng gọi là tabLength rằng nên trả về một chuỗi. Đây là định dạng trong tài liệu văn bản.Báo cáo chuyển đổi/trường hợp

Ai đó có thể xem câu lệnh chuyển đổi của tôi và xem tại sao tôi gặp lỗi trên dòng 6. Đó là 'trường hợp' mà câu lệnh chuyển đổi đang diễn ra.

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

Thông báo lỗi:

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 

Nó chỉ đang xảy ra với giá trị được gửi qua [5-15].

+0

Bạn có thể đăng thông báo lỗi chính xác? Hoạt động hoàn toàn tốt ở đây (PS 4.0 trên Win7). –

+0

Vâng xin lỗi về điều đó – Dominic

Trả lời

6

[5-15] không phải là lớp ký tự regex hợp lệ. Bạn đang so khớp các chuỗi, chứ không phải số, do đó, [5-15] về cơ bản nói "khớp một ký tự đơn từ '5' đến '1' hoặc '5'" không phải là những gì bạn muốn.

Nếu bạn loại bỏ điều kiện ở giữa đó, [16-24] sẽ không tương tự.

Hãy thử một tuyên bố switch mà không sử dụng regex, nhưng sử dụng một khối kịch bản cho điều kiện, do đó bạn có thể sử dụng một loạt thử nghiệm, như thế này:

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

Trong PowerShell 3+, bạn có thể sử dụng toán tử -in và đảo ngược thứ tự:

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

Tốt. Một trường hợp khác mà Regex chỉ đơn giản là không có giá trị nó. Tôi sẽ thể hiện bản thân mình ra khỏi –

+0

@ MathiasR.Jessen đây là bài tập về nhà sau khi tất cả, đôi khi giới hạn của các vấn đề đưa ra không có ý nghĩa, vì vậy có lẽ anh * phải * sử dụng regex cho điều này, vì vậy +1 để hiển thị cách regex . – briantist

2

Đối sánh theo từng ký tự, không phải là số nguyên. Phạm vi [5-15] đơn giản là không có ý nghĩa đối với các động cơ regex.

Hãy thử thêm neo:

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

@briantist đánh tôi để trả lời câu hỏi trước mắt của bạn. Tuy nhiên, vì bạn nói rằng mục tiêu của bạn là định dạng văn bản, bạn có thể muốn xem xét một cách tiếp cận hoàn toàn khác.

PowerShell có format operator (-f) cho phép bạn định dạng chuỗi (cũng như số hoặc ngày) theo nhiều cách khác nhau. Ví dụ nếu bạn muốn văn bản liên kết ở bên phải của một cột rộng 30 ký tự (ví dụ: văn bản trái độn), bạn có thể làm một cái gì đó như thế này:

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

Bạn cũng có thể sử dụng cho một cột đó là đệm trên đúng.

diễn:

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

Công việc tuyệt vời nhận được những gì là (có thể) vấn đề gốc thực tế! – briantist

Các vấn đề liên quan