Есть ли причина, по которой .split в PowerShell не работает для меня? - PullRequest
2 голосов
/ 13 марта 2020
$fID = Read-Host "Enter URL" 

if($fID -Match "/"){

$fID = $fID.split("/")[1].split(".")[0]

}

$fID[1] 

ввод: https://split.string.com (например)

что я хочу, это просто " split "

вывод: ничего

Кто-нибудь может помочь с этим?

Ответы [ 2 ]

4 голосов
/ 13 марта 2020

Проблема в том, что разделитель / разделяется на в каждом случае из / int во входной строке, так что // в https://split.string.com приводит к extra, empty элемент в результирующем массиве токенов (пустая строка между двумя / символами), который возвращает индекс [1].

В PowerShell [Core] 6+, просто используйте // в качестве разделителя :

PSCore> 'https://split.string.com'.split('//')[1].split('.')[0]
split

Однако это не работает в Windows PowerShell , поскольку разбиение по одному экземпляру [string] не поддерживается базовым. NET Framework (вместо этого отдельные символы интерпретируются как разделители).

Там вы можете просто учесть дополнительный пустой элемент и настроить индекс соответственно, как предлагает Олаф :

WinPS> 'https://split.string.com'.split('/')[2].split('.')[0]
split

Примечание: удаление пустой записи с помощью необязательного аргумента также работает, но является и многословным, и неясным: 'https://split.string.com'.split('/', [StringSplitOptions]::RemoveEmptyEntries)[1].Split('.')[0]


альтернатива - использовать Powe Оператор rShell на основе регулярных выражений -split оператор , который, как правило, предпочтительнее [string] типа .Split() и работает в обеих редакциях PowerShell:

PS> ('https://split.string.com' -split '//|\.')[1]
split

Regex //|\. соответствует либо (|) строка //, либо литерал . (экранируется как \., потому что . само по себе имеет специальное значение в регулярном выражении).

См. этот ответ для получения справочной информации, в том числе, почему придерживаться PowerShell -национальные функции защищают от непреднамеренных изменений в поведении из-за новых. NET перегрузок метода, вводимых позже.

1 голос
/ 13 марта 2020

Чтобы дополнить исчерпывающий ответ от @ mklement0 на актуальный вопрос " почему ":
Я бы взял это под другим углом и начал бы с host свойство uri класс:

# $fID = [uri](Read-Host "Enter URL" )
$fID = [uri]'https://split.string.com'

$fID.Host.Split('.')[0]

выход

 split
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...