Могу ли я использовать разбиение на строку два раза подряд, используя трубопровод? - PullRequest
1 голос
/ 20 марта 2019

Допустим, у меня есть следующая строка dog.puppy/cat.kitten/bear.cub. Я хочу получить только bear. Я могу сделать это, выполнив следующее:

$str = "dog.puppy/cat.kitten/bear.cub"
$str = $str.split('/')[2]
$str = $str.split('.')[0]

Могу ли я получить bear, используя одну линию, используя трубопровод? Это не работает, но это будет примерно так:

$str = "dog.puppy/cat.kitten/bear.cub"
$str = $str.split('/')[2] | $_.split('.')[0]

Ответы [ 3 ]

4 голосов
/ 20 марта 2019

Могу ли я получить "медведь", используя одну строку , используя трубопровод ?

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

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

PS> ('dog.puppy/cat.kitten/bear.cub' -split '[/.]')[-2]
bear

То есть разделить входную строку наили литерал / или литерал . (с использованием набора символов, [...]) и возврат предпоследнего (от второго к последнему) ([-2]) токена.

См. этот ответ , почему вы обычно предпочитаете -split оператор , например, String.Split() метод .
Такой жеприменяется аналогично предпочтению оператора -replace методу String.Replace().


Легко цепочка эти операторы :

PS> ('dog.puppy/cat.kitten/bearOneTwoThree.cub' -split '[/.]')[-2] -csplit '(?=\p{Lu})'
bear
One
Two
Three

То есть возвращают предпоследний токен и разбивают его регистр - чувствительно (используя вариант -csplit оператора -split) всякий раз, когданачинается заглавная буква (\p{Lu}) с использованием положительного прогнозного утверждения , (?=...).

3 голосов
/ 20 марта 2019

Вы можете сделать это:

$str = "dog.puppy/cat.kitten/bear.cub".split('/')[2].split('.')[0]

Трубопровод не требуется.

1 голос
/ 20 марта 2019

Существует более простое решение:
метод .split() использует каждый символ для разделения,
с использованием отрицательного индекса отсчитывается от спины, поэтому

> "dog.puppy/cat.kitten/bear.cub".split( '/.')[-2]
bear

Ваш другой вопрос может быть решенс оператором -csplit на основе RegEx, использующим
не требующих затрат положительного прогнозирования и
конечный -join ' ' для объединения элементов массива с пробелом.

$str = "dog.puppy/cat.kitten/bearOneTwoThree.cub"
$str = $str.split('/.')[-2] -csplit '(?=[A-Z])' -join ' '
$str
bear One Two Three
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...