2014-05-22 2 views
0

После борьбы с этим в течение получаса, я испытал это различие, разделив строку на пробелы, в зависимости от того, какой синтаксис вы используете.Powershell split() vs -split - какая разница?

Простая строка:

$line = "1: 2: 3: 4: 5: " 

Сплит пример 1 - обратите внимание на дополнительное пространство с токенов от 1 года:

$ln = $line.split(":\s+") 
$ln 
1 
2 
3 
4 
5 

Split Пример 2 - пространства пропали (как они должен)

$ln = $line -split ":\s+" 
$ln 
1 
2 
3 
4 
5 

Я подозреваю, что это первый метод .NET (?), А оператор -split PS, возможно, имеет более искушенные умения, когда дело доходит до интерпретации регулярных выражений.

Однако, когда я попробовал первый метод с разделом вроде ": ", это тоже не сработало. Если это .NET, нужно ли что-то правильно интерпретировать факт, он должен использовать оба символа в качестве разделителя?

+0

@Rahul - это не "добавить" дополнительное пространство к выходу. 'split()' fail (по причинам, объясненным ниже) для обработки пробела после символа «:» в качестве разделителя, поэтому пространство _remains_ как часть вывода. – Trix

ответ

1

Метод .Net System.String.Split не имеет перегрузки, которая принимает единственный параметр, который является строкой. Он также не понимает регулярное выражение.

Что происходит, так это то, что powershell принимает строку, которую вы передаете, и преобразовывая ее в массив символов. Это, по существу, разделив на следующих символов: \, s, +

При использовании «:» в качестве разделителя, я предположил бы, что вы получили результаты как

1 

2 

3 

4 

5 

Это происходит потому, что без указания строки split для метода .Net, он будет содержать пустые строки, которые он находит между соседними разделителями.

0

Метод разделения строк принимает аргумент массива символов (а не строку). Если вы укажете несколько символов, он будет разбит на любой экземпляр любого из этих символов.

1
  1. . Объект .Net не принимает регулярное выражение, но интерпретирует его как литеральную строку.

    $line = "1: 2: 3: 4: 5: " 
    $ln = $line.split("\s") 
    $ln 
    

Выход:

1: 2: 3: 4: 5: 

Таким образом, в вашем примере, то "+" игнорируется в нем не нашли в $ ЛУ, но ": \ s" используется для разделения:

$ln = $line.split(":\s+") 
$ln 

Output: 

1 
2 
3 
4 
5 

который является такой же, как

$ln = $line.split(":") 
$ln 

2.while оператор powershell -split интерпретирует «\ s» как допустимое регулярное выражение, т. Е. Пространство. Так как он может найти и: и \ s в строке, для разделения используется комбинация «: \ s». например:

$line = "1:2:3: 4: 5: " 
$ln = $line -split ":" 
$ln 

выход:

1 
2 
3 
4 
5 
Смежные вопросы