2

私はこのような文字列を持っています

svchost.exe                   4464 Services                   0        47.656 K

多くのスペースがあり、それぞれの場合でスペースの量が異なることに注意してください

svchost.exenameと 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 に答える