我有一个看起来像这样斯卡拉 - 删除空格
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