在冒号后的第二个空格处拆分字符串

时间:2016-03-10 04:20:30

标签: regex powershell

我有以下字符串,我需要在标签

之前的空格处拆分
Set<Integer> s1 = new TreeSet(c1); //where c1 is an instance of Collection interface type

期望的结果

RATE: 3.00% SPEED: 280 TOT. WT: 52172.6

标签中的空格正在扼杀我。拆分字符串时可以使用正则表达式吗?正则表达式并不是更加强大,我正在用一种表达方式来摧毁它。

更新 因为我只抓住了字符串的第一部分,所以我错过了一些值本身就有空格的事实:

RATE: 3.00%
SPEED: 280
TOT. WT: 52172.6

期望的结果:

RATE: 3.00% SPEED: 280 TOT. WT: 52172.6 ERROR: +0.0 (10) AVG: 3.07 DEVIATION: 6.10

感谢@ p.s.w.g的解决方案。可以使用Select-String中的匹配项将成员添加到现有对象吗?

4 个答案:

答案 0 :(得分:0)

您可以使用positive lookbehind(?<= … ))。例如:

> $str = 'RATE: 3.00% SPEED: 280 TOT. WT: 52172.6'
> $str -split '(?<=:\s*\S+)\s+'
RATE: 3.00%
SPEED: 280
TOT. WT: 52172.6

这将在任何空格前分隔字符串,该空格前面紧跟冒号,零个或多个空白字符以及一个或非空白字符。

或者,您可以使用Select-String cmdlet进行更多结构化处理,如下所示:

> Select-String '(?<key>[^\s:][^:]+):\s+(?<val>\S+)' -InputObject $str -AllMatches `
  | %{$_.Matches} `
  | Select-Object -Property @{n='key';e={$_.Groups['key']}}, `
                            @{n='val';e={$_.Groups['val']}}

key     val
---     ---
RATE    3.00%
SPEED   280
TOT. WT 52172.6

更新根据您的更新要求,您需要更高级的正则表达式: 这个使用lookbehind 前瞻((?= … ))。

> $str = 'RATE: 3.00% SPEED: 280 TOT. WT: 52172.6 ERROR: +0.0 (10) AVG: 3.07 DEVIATION: 6.10'
> $str -split '(?<=:\s*[\d.%() +-]+)\s+(?=[A-Z. ]+:)'
RATE: 3.00%
SPEED: 280
TOT. WT: 52172.6
ERROR: +0.0 (10)
AVG: 3.07
DEVIATION: 6.10

但是有两个这样的外观非常难看。我会推荐更像这样的东西:

Select-String '(?<key>[^\s:][^:]+):\s+(?<val>[\d.%() +-]+)' -InputObject $str -AllMatches `
  | %{$_.Matches} `
  | Select-Object -Property @{n='key';e={$_.Groups['key']}}, `
                            @{n='val';e={$_.Groups['val']}}
key       val                                                                   
---       ---                                                                   
RATE      3.00%                                                                 
SPEED     280                                                                   
TOT. WT   52172.6                                                               
ERROR     +0.0 (10)                                                             
AVG       3.07                                                                  
DEVIATION 6.10 

请注意,在这两种情况下,如果值包含其他字符,则可能必须修改[\d.%() +-]字符类。

答案 1 :(得分:0)

我会用换行符替换“分隔”空格,然后在换行符处拆分:

$s = 'RATE: 3.00% SPEED: 280 TOT. WT: 52172.6 ERROR: +0.0 (10) AVG: 3.07 DEVIATION: 6.10'
$a = $s -replace '(.+?: [^a-z]+) ',"`$1`n" -split "`n"

答案 2 :(得分:0)

更详细,但也更直观易读:

$string = 'RATE: 3.00% SPEED: 280 TOT. WT: 52172.6'

$string -match '(RATE:.+?)\s+(SPEED:.+?)\s+(TOT. WT:.+)\s*$' > $nul
$Matches[1..3]

RATE: 3.00%
SPEED: 280
TOT. WT: 52172.6

如果你想要一个物体:

New-Object PSObject -Property $(ConvertFrom-StringData  ($Matches[1..3] -replace ':','=' | Out-String)) |
      Select RATE,SPEED,'TOT. WT'

RATE  SPEED TOT. WT
----  ----- -------
3.00% 280   52172.6

答案 3 :(得分:0)

我做到了,但有两个步骤,例如(这个例子用分号)

$p=$suppliedapps.replace("; ",";")
$AppsArray=$p.split(";")
$appsarray