Разбить несколько чисел из строки в массив - PullRequest
0 голосов
/ 30 января 2019

Я ищу быструю однострочную оболочку PowerShell для разбиения строки, подобной этой:

"123.456,789 101-202_303%404..505(606)      707 a bunch of text 808 %%%*&#!@#$%^&*() 909"

на массив, подобный этому:

(123,456,789,101,202,303,404,505,606,707,808,909)

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

Я искал в Интернете решение, но не совсем нашел то, что искал.

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Я сейчас разговариваю по телефону, поэтому не буду много печатать ..

$str -split '\D+' | Sort-Object -Unique

Должен это сделать.


В дополнение к этому, после -split элементы (хотя и числа) по-прежнему являются строками.Выполнение вышеупомянутой сортировки будет поэтому сортировать буквенно-цифровой, а не числовой.Поскольку в этом примере все числа имеют три цифры, сортировка будет выглядеть нормально, но если там есть числа с меньшими или большими цифрами, вы поймете, что я имею в виду:

Допустим, ваша строка выглядит следующим образом:

$str = "123.456,789;12 101-202_303%404..505(606)  7    707 a bunch of text 808 %%%*&#!@#$%^&*() 909"

Разделение и сортировка даст вам массив, подобный:

101
12
123
202
303
404
456
505
606
7
707
789
808
909

Если вы немного измените Sort-Object, чтобы стать таким:

$str -split '\D+' | Sort-Object -Property {[int]$_} -Unique

Выходные данные будут отсортированы по номеру, поэтому результат будет следующим:

7
12
101
123
202
303
404
456
505
606
707
789
808
909

Конечно, объединить элементы после этого, чтобы они стали строкой с разделителями-запятыми, так же просто, как

($str -split '\D+' | Sort-Object -Property {[int]$_} -Unique) -join ','

Выход:

7,12,101,123,202,303,404,456,505,606,707,789,808,909
0 голосов
/ 30 января 2019
$x = "123.456,789 101-202_303%404..505(606)      707 a bunch of text 808 %%%*&#!@#$%^&*() 909"
$y = $x -split '[^\d]+(?=\d+)'

Результат:

$y -join ','  #   123,456,789,101,202,303,404,505,606,707,808,909
0 голосов
/ 30 января 2019

Вы можете использовать регулярные выражения, чтобы получить замену всех без цифр, а затем очистить пустые части массива

"123.456,789 101-202_303%404..505(606)      707 a bunch of text 808 %%%*&#!@#$%^&*() 909" -split '\D' | ?({ $_ -ne "" })
...