我有一个看起来像这样的字符串
svchost.exe 4464 Services 0 47.656 K
请注意,有很多空格,并且每种情况下空格的数量都不同
我想提取名称svchost.exe
和 pid 4464
。我可以做到这一点,但只能用命令式的方式。我很难以一种实用的方式来解决这个问题。
可以用正则表达式解决这个问题,但我想看看你如何用函数式编程做这样的事情。
我有一个看起来像这样的字符串
svchost.exe 4464 Services 0 47.656 K
请注意,有很多空格,并且每种情况下空格的数量都不同
我想提取名称svchost.exe
和 pid 4464
。我可以做到这一点,但只能用命令式的方式。我很难以一种实用的方式来解决这个问题。
可以用正则表达式解决这个问题,但我想看看你如何用函数式编程做这样的事情。
十分简单:
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)
更新
或s.split(" +")
依赖于正则表达式美的使用
这实际上不是一个好方法,但是:
(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
,您还可以覆盖其他类型的空白,这可能与上述情况相关。(制表符?)