我有以下字符串,我需要在标签
之前的空格处拆分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中的匹配项将成员添加到现有对象吗?
答案 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