Проблема в том, что разделитель /
разделяется на в каждом случае из /
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 перегрузок метода, вводимых позже.