我可以使用管道在字符串上连续两次使用split吗?

时间:2019-03-20 00:13:30

标签: powershell

假设我有以下字符串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 个答案:

答案 0 :(得分:4)

  

我可以用一条管道使用管道 来获得“轴承”吗?

字符串已经存储在内存中,没有没有理由使用管道 -这样只会减慢速度。

>

相反,使用PowerShell的运算符 ,该运算符比使用管道更快,并且通常更灵活类似命名为 .NET [string]类型的方法 ,因为它们可对 regexes (正则表达式)进行操作,并且也可以在整个数组上操作:

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

也就是说,用文字/或文字.(使用字符集[...])分割输入字符串,并返回倒数第二个(倒数第二个)({{ 1}})令牌。

例如,请参见this answer,以了解为什么您通常更喜欢-split operator而不是String.Split() 方法
类似地,类似的情况是更喜欢-replace operator而不是String.Replace()方法。


链接这些运算符很容易:

[-2]

也就是说,返回倒数第二个令牌并区分大小写- (使用PS> ('dog.puppy/cat.kitten/bearOneTwoThree.cub' -split '[/.]')[-2] -csplit '(?=\p{Lu})' bear One Two Three 运算符的-csplit变体),只要大写字母({{1} })使用positive look-ahead assertion-split)开始。

答案 1 :(得分:3)

您可以这样做:

using CR_Vector_t = std::vector<uint16_t, CR_Vector_Allocator>;

CR_Vector_t Generate_CR_Vector(){

  /* total_parameters is a member of the same class
     as this member function and is defined elsewhere */
  CR_Vector_t cr_vec (total_parameters); 
  std::uniform_int_distribution<uint16_t> dist_;

  /* urng_ is a member variable of type std::mt19937_64 in the class */
  std::generate(cr_vec.begin(), cr_vec.end(), [this, &dist_](){
     return dist_(this->urng_);});
     return cr_vec; 
}

void Prepare_Next_Generation(...){
  /* 
     ... 
  */
  using hpx::parallel::execution::par_unseq;
  hpx::parallel::for_loop_n(par_unseq, 0l, pop_size, [this](int64_t idx){
    auto crossovers = Generate_CR_Vector();
    auto new_parameters = Generate_New_Parameters(/* ... */, std::move(crossovers));
  }
}

不需要管道。

答案 2 :(得分:1)

有一个更简单的解决方案,
.split()方法使用每个字符进行拆分,
使用负索引从背面开始计数,因此

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

您的其他问题可以使用基于RegEx的-csplit运算符使用
来解决。 nonconsuming positive lookahead
最后的-join ' ',用于将数组元素与空格连接起来。

$str = "dog.puppy/cat.kitten/bearOneTwoThree.cub"
$str = $str.split('/.')[-2] -csplit '(?=[A-Z])' -join ' '
$str
bear One Two Three