2

我有一个看起来像这样的字符串

svchost.exe                   4464 Services                   0        47.656 K

请注意,有很多空格,并且每种情况下空格的数量都不同

我想提取名称svchost.exe和 pid 4464。我可以做到这一点,但只能用命令式的方式。我很难以一种实用的方式来解决这个问题。

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

4

4 回答 4

10

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

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

无需后过滤。

于 2012-10-21T18:06:14.837 回答
5

十分简单:

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(" +")依赖于正则表达式美的使用

于 2012-10-21T17:41:45.290 回答
1

这实际上不是一个好方法,但是:

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

如果它不是字符串,那将是一种使用方法。

于 2012-10-21T18:21:56.117 回答
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,您还可以覆盖其他类型的空白,这可能与上述情况相关。(制表符?)

于 2012-10-22T06:06:25.493 回答