2012-02-21 31 views
5

Dường như toán tử PowerShell -split và phương thức .NET Split() hoạt động hoàn toàn khác.
.NET xử lý các chuỗi phân cách như thể chúng là các mảng ký tự..NET String Split()

$str = "123456789" 
Write-Host ".NET Split(): " 
$lines = $str.Split("46") 
Write-Host "Count: $($lines.Length)" 
$lines 

$str = "123456789" 
Write-Host "-split operator: " 
$lines = $str -split "46" 
Write-Host "Count: $($lines.Length)" 
$lines 

Output:

.NET Split(): 
Count: 3 
123 
5 
789 


-split operator: 
Count: 1 
123456789 

Có cách nào để làm cho một ứng dụng .NET sử dụng kỹ thuật tương tự như PowerShell, và sử dụng các dấu phân cách chuỗi như một đơn vị vững chắc? Hy vọng rằng, không có RegEx.

Cảm ơn.

EDIT: này làm việc trong PowerShell, sử dụng Split():

Write-Host "Divided by 46:" 
"123456789".Split([string[]] "46", [StringSplitOptions]::None) 

Write-Host "`n`nDivided by 45:" 
"123456789".Split([string[]] "45", [StringSplitOptions]::None) 


Divided by 46: 
123456789 


Divided by 45: 
123 
6789 
+0

Lạ! Điều tốt tôi không sử dụng Powershell; p – leppie

Trả lời

5

Phương thức String.Split của .NET có hai (overload) quá tải. Việc đầu tiên nhận được một mảng ký tự, và mảng thứ hai là một mảng. Không thực sự là một quá tải nhận được một chuỗi. Cách đầu tiên hoạt động giống như bạn mô tả, với mỗi nhân vật được tách riêng lẻ. Việc chia tách thứ hai dọc theo toàn bộ chuỗi, như bạn muốn nó.

Do cách Powershell phân tích cú pháp các tham số, một chuỗi được chuyển đến Split sẽ được phân tích cú pháp thành mảng char và quá tải đầu tiên được gọi. Nếu bạn có thể chỉ định rõ ràng rằng "46" là một mảng chứa chỉ một chuỗi, nó sẽ cung cấp cho bạn hành vi mà bạn muốn.

9

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Khi bạn đang gọi điện thoại string.Split(string), nó sử dụng quá tải string.Split(char[]) (như string có thể được đúc để một char[], nhưng không được string[]).

Để sử dụng quá tải string.Split(string[], StringSplitOptions), bạn phải gọi theo cách "123456789".Split(new[] { "45" }, StringSplitOptions.None).

1

Sự khác biệt chính là toán tử -split có thể lấy một chuỗi hoặc một mẫu regex, trong khi phương thức tách chỉ có thể lấy chuỗi. Toán tử -split có rất nhiều tùy chọn để tinh chỉnh hành vi của nó. Bạn có thể tìm thêm thông tin trong tài liệu about_split:

http://technet.microsoft.com/en-us/library/dd347708.aspx

0

Một khác biệt khác mà tôi không thấy ai đề cập đến đó là .split string() phương pháp duy nhất hoạt động trên các đối tượng chuỗi duy nhất bạn đang gọi phương thức trên.

Toán tử Powershell -split sẽ lấy một mảng làm đối số của nó và chia tất cả các phần tử của mảng cùng một lúc.