【问题标题】:Split multiple numbers from a string into an array将字符串中的多个数字拆分为数组
【发布时间】:2019-02-01 17:20:10
【问题描述】:

我正在寻找一个快速的 PowerShell 单线来拆分这样的字符串:

"123.456,789 101-202_303%404..505(606) 707 一堆文字 808 %%%*!@#$%^&*() 909"

到这样的数组中:

(123,456,789,101,202,303,404,505,606,707,808,909)

基本上,只要两个数字被任何除了一个数字分开,那么就认为它们是两个独立的数字。

我已经在网上搜索了一个解决方案,但还没有完全找到我想要的。

【问题讨论】:

  • 试试$str -split '\D'\D 是“任何非数字”的正则表达式。如果您怀疑中间有多个非数字,请使用\D+
  • 这非常接近,它为每个空间添加了额外的结果,但这可以通过-split '\D' | Where-Object{$_ -ne ""} | sort -Unique 解决。请随意回答。
  • 为什么这被否决了?

标签: powershell powershell-4.0


【解决方案1】:

我现在正在打电话,所以我不会做太多打字..

$str -split '\D+' | Sort-Object -Unique

应该这样做。


除此之外,在-split 之后,元素(虽然是数字)仍然是字符串。因此,执行上述排序将排序字母数字,而不是数字。由于在示例中所有数字都有三位数,因此排序看起来不错,但如果其中有数字少或多的数字,您会明白我的意思:

假设您的字符串如下所示:

$str = "123.456,789;12 101-202_303%404..505(606)  7    707 a bunch of text 808 %%%*&#!@#$%^&*() 909"

拆分和排序会给你一个像这样的数组:

101
12
123
202
303
404
456
505
606
7
707
789
808
909

如果你把Sort-Object稍微改一下就变成这样了:

$str -split '\D+' | Sort-Object -Property {[int]$_} -Unique

输出将按数字排序,因此结果如下:

7
12
101
123
202
303
404
456
505
606
707
789
808
909

当然,将其后的元素连接成逗号分隔的字符串就像

($str -split '\D+' | Sort-Object -Property {[int]$_} -Unique) -join ','

输出:

7,12,101,123,202,303,404,456,505,606,707,789,808,909

【讨论】:

    【解决方案2】:
    $x = "123.456,789 101-202_303%404..505(606)      707 a bunch of text 808 %%%*&#!@#$%^&*() 909"
    $y = $x -split '[^\d]+(?=\d+)'
    

    结果:

    $y -join ','  #   123,456,789,101,202,303,404,505,606,707,808,909
    

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式替换所有非数字,然后清除空数组部分

      "123.456,789 101-202_303%404..505(606)      707 a bunch of text 808 %%%*&#!@#$%^&*() 909" -split '\D' | ?({ $_ -ne "" })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 2016-04-01
        • 2020-10-19
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多