2012-10-21 90 views
2

我有一个看起来像这样斯卡拉 - 删除空格

svchost.exe     4464 Services     0  47.656 K 

注意,有很多的空间和空间量的字符串,在每种情况下不同

我想提取名字svchost.exe和pid 4464。我将能够做到这一点,但只能采取必要的方式。我很难用功能性的方式来解决这个问题。

用正则表达式可以解决这个问题,但我想看看你如何用函数式编程来做这样的事情。

回答

5

易peasy:

val s = "svchost.exe     4464 Services     0  47.656 K" 
s.split(" ").filterNot(str => str == "") 
// Array[java.lang.String] = Array(svchost.exe, 4464, Services, 0, 47.656, K) 

UPDATE

,或者使用s.split(" +")其依赖于正则表达式美容

+0

嗯,现在我觉得很蠢。我应该知道这一点。谢谢 –

+0

我会s.split('').filter(_。length> 0)',但同样的交易。那么,假设's.split(“+”)'在问题的前提下是被禁止的。 –

+1

我会用@Tomasz“+”版本替换“”。 – pedrofurla

10

利用这一点String.split()接受一个正则表达式的事实:

s.split(" +") //Array(svchost.exe, 4464, Services, 0, 47.656, K) 

不需要后期过滤。

1

这不是真正做一个好办法,但:

(s,s.drop(1)+" ").zipped.filter(_!=' ' || _!=' ')._1.split(' ') 

是使用,如果它不是一个字符串的方法。

0

我不完全确定这是否回答你的问题;它可能不会,因为它使用了一个正则表达式,但是再次,其他一些答案也是如此,这至少使用了模式匹配。

使用正则表达式:

val str = "svchost.exe     4464 Services     0  47.656 K" 
val Process = """^([^\s]*)[\s]*([^\s]*).*$""".r 
val Process(name, pid) = str 

在REPL输入这个,你会得到:

name: String = svchost.exe 
pid: String = 4464 

使用\s,还包括其他类型的空白,这可能是相关的在上述情况下。 (制表符?)