2016-05-10 7 views
3

Я хочу разбить строку и сохранить полученные токены в переменных.Разделить строку без разделителей в PowerShell

Например, моя строка 160519, и я хочу, чтобы разделить его на пути, где 16, 05 и 19 сохраняются в отдельных переменных.

Я пробовал использовать -split, но поскольку в моей строке нет разделителей, мне трудно разрезать строку.

+0

использование [подстроки] (https://msdn.microsoft.com/en-us/library/system.string.substring%28v = vs.110% 29.aspx) – lloyd

ответ

4

Если у вас нет разделителя, вы не можете с пользой использовать -split. Вместо этого вам придется использовать что-то вроде:

$d = '160519' 
$a, $b, $c = $d.SubString(0, 2), $d.SubString(2, 2), $d.SubString(4, 2) 

# (That is like doing: 
$a = $d.SubString(0, 2) 
$b = $d.SubString(2, 2) 
$c = $d.SubString(4, 2) 
# but doing all three in one go) 

остановка здесь, это все, что вам нужно. :-)


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

$d = '160519' 
$a, $b, $c = ($d[0..1] -join ''), ($d[2..3] -join ''), ($d[4..5] -join '') 

[Изменить: Я думаю, если вы действительно заботитесь, вы можете заставить -split работать на вас, поскольку вы можете описать два числа с регулярным выражением. Проблема с этим заключается в том, что вы обычно разделяете на основе поиска разделителя, отбрасывая разделитель и сохраняете остальное. Если вы хотите сохранить разделитель вы можете сделать это с регулярными выражениями групп, но -split будет выводить пустое пространство, где он считает, что содержание должно быть, поэтому он принимает уродливый обходной путь, чтобы сделать его работу:

# split based on a regular expression describing two digits \d\d 
# capture the digits in a group (\d\d) 
# Filter the output through Where-Object |? 
# Only the numbers will pass, the empty space won't 
$a, $b, $c = $d -split '(\d\d)' |? {$_} 

или А более стандартное использование регулярных выражений с [Regex] библиотеки .Net:

$a, $b, $c = [Regex]::Matches($d, '\d\d') | Select -ExpandProperty Value 

или в PowerShell

$d -match '(\d\d)(\d\d)(\d\d)' 
$a, $b, $c = $matches[1,2,3] 

# hey, this one's pretty nice. 

]

+0

split with regex делает это, см. мой ответ – Paarth

+1

++; Я согласен с тем, что последнее довольно мило - возможно, заслуживает внимания. – mklement0

+0

Спасибо за ваши ответы ... Я получил эту работу – Pravin

7

Фактически вы можете разделить строку так, как если бы вы использовали регулярное выражение.

$arr = $string -split "(..)" -ne "" 

. соответствует любому символу. Затем нам нужно отфильтровать массив, чтобы удалить пустые значения, где находится -ne "" (спасибо mklement0 за предложение заменить | ? {$_}).

В действии:

C:\Users\Paarth> $string = "160519" 
C:\Users\Paarth> $arr = $string -split "(..)" -ne "" 
C:\Users\Paarth> $arr 
16 
05 
19 
C:\Users\Paarth> 
+0

Это довольно пятно. Почему он создает пустые значения, которые необходимо удалить? –

+1

В соответствии с [документами] (https://msdn.microsoft.com/en-us/library/8yttk7sy (v = vs.110) .aspx) пустые строки добавляются там, где есть смежные совпадения. Это действительно разделение строки * и * извлечение некоторого регулярного выражения, но как только мы разделимся на это, ничего не осталось, поэтому он работает. Мы удаляем пустые строки и оставляем только совпадающие записи в массиве. – Paarth

+0

@JasonBoyd Вы можете технически подойти к этому, используя регулярное выражение regex.match и не иметь дело с пустыми строками, но тогда вам придется иметь дело с немного более вовлеченным регулярным выражением и группами и еще много чего. Это яснее ИМО. – Paarth

0

попробовать этот

$text="160519" 
$var0, $var1, $var2, $var3= $text -split "(\d{2})(\d{2})(\d{2})" 
$var1 
$var2 
$var3 
Смежные вопросы