假设我有以下字符串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]
我可以使用一行使用管道?
来获得"熊"
使用字符串已经存储在内存中, no 使用 pipeline 的充分理由只会放慢速度。
相反类似地命名为 .net[string]
类型的方法,因为它们在 regexes (正则表达式)上操作,并且也可以在整个数组:
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
也就是说,返回倒数倒数的令牌并拆分case- case-敏感性(使用-split
操作员的-csplit
变化),每当大写字母(p{Lu}
)开始使用正面的sastertion,(?=...
)。
您可以做到这一点:
$str = "dog.puppy/cat.kitten/bear.cub".split('/')[2].split('.')[0]
不需要管道。
有一个更轻松的解决方案,.split()
方法使用每个字符进行拆分,
使用负面索引计数,因此
> "dog.puppy/cat.kitten/bear.cub".split( '/.')[-2]
bear
您可以使用A
的基于REGEX的-csplit
操作员来解决其他问题不耗费积极的lookahead和
最终的-join ' '
,将数组元素与空间相连。
$str = "dog.puppy/cat.kitten/bearOneTwoThree.cub"
$str = $str.split('/.')[-2] -csplit '(?=[A-Z])' -join ' '
$str
bear One Two Three