我有一個看起來像這樣斯卡拉 - 刪除空格
svchost.exe 4464 Services 0 47.656 K
注意,有很多的空間和空間量的字符串,在每種情況下不同
我想提取名字svchost.exe
和pid 4464
。我將能夠做到這一點,但只能採取必要的方式。我很難用功能性的方式來解決這個問題。
用正則表達式可以解決這個問題,但我想看看你如何用函數式編程來做這樣的事情。
我有一個看起來像這樣斯卡拉 - 刪除空格
svchost.exe 4464 Services 0 47.656 K
注意,有很多的空間和空間量的字符串,在每種情況下不同
我想提取名字svchost.exe
和pid 4464
。我將能夠做到這一點,但只能採取必要的方式。我很難用功能性的方式來解決這個問題。
用正則表達式可以解決這個問題,但我想看看你如何用函數式編程來做這樣的事情。
易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(" +")
其依賴於正則表達式美容
利用這一點String.split()
接受一個正則表達式的事實:
s.split(" +") //Array(svchost.exe, 4464, Services, 0, 47.656, K)
不需要後期過濾。
這不是真正做一個好辦法,但:
(s,s.drop(1)+" ").zipped.filter(_!=' ' || _!=' ')._1.split(' ')
是使用,如果它不是一個字符串的方法。
我不完全確定這是否回答你的問題;它可能不會,因爲它使用了一個正則表達式,但是再次,其他一些答案也是如此,這至少使用了模式匹配。
使用正則表達式:
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
,還包括其他類型的空白,這可能是相關的在上述情況下。 (製表符?)
嗯,現在我覺得很蠢。我應該知道這一點。謝謝 –
我會s.split('').filter(_。length> 0)',但同樣的交易。那麼,假設's.split(「+」)'在問題的前提下是被禁止的。 –
我會用@Tomasz「+」版本替換「」。 – pedrofurla