2012-10-21 107 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,還包括其他類型的空白,這可能是相關的在上述情況下。 (製表符?)