我有一个看起来像这样的字符串
svchost.exe 4464 Services 0 47.656 K
请注意,每种情况下都有很多空格和空格量不同
我想提取名称svchost.exe
和pid 4464
。我能够做到这一点,但只能采取必要的方式。我很难以功能性的方式思考解决这个问题。
有可能用正则表达式来解决这个问题,但我想看看你是如何使用函数式编程做的。
答案 0 :(得分:10)
利用String.split()
接受正则表达式的事实:
s.split(" +") //Array(svchost.exe, 4464, Services, 0, 47.656, K)
无需后期过滤。
答案 1 :(得分: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)
<强>更新强>
或使用依赖于regexp beauty的s.split(" +")
答案 2 :(得分:1)
这实际上不是一个好方法,但是:
(s,s.drop(1)+" ").zipped.filter(_!=' ' || _!=' ')._1.split(' ')
如果它不是字符串,将是一种使用方法。
答案 3 :(得分: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
,您还可以覆盖其他类型的空白,这可能与上述情况相关。 (制表符?)