首页 > 解决方案 > 过滤包含字符串模式的列表

问题描述

我需要过滤列表中包含字符串Status=ACTIVE的元素并将其保存为新列表。

稍后我还需要使用Status=STOPPEDSystem=Windows过滤相同的列表。

列表:

Programs=
    ["Process=1,System=Linux,PID=240,Program=DRMX,Status=ACTIVE",
    "Process=1,System=Linux,PID=240,Program=DRMX,Status=STOPPED",
    "Process=1,System=Windows,PID=240,Program=DRMX,Status=ACTIVE",
    "Process=1,System=Linux,PID=242,Program=DRMX,Status=ACTIVE",
    "Process=1,System=Windows,PID=242,Program=DRMX,Status=STOPPED",
    "Process=1,System=Windows,PID=242,Program=DRMX,Status=ACTIVE",
    "Process=1,System=Linux,PID=246,Program=DRMX,Status=ACTIVE",
    "Process=1,System=Linux,PID=246,Program=DRMX,Status=STOPPED",
    "Process=1,System=Linux,PID=246,Program=DRMX,Status=ACTIVE"].

想要的结果:

["Process=1,System=Linux,PID=240,Program=DRMX,Status=ACTIVE",
    "Process=1,System=Windows,PID=240,Program=DRMX,Status=ACTIVE",
    "Process=1,System=Linux,PID=242,Program=DRMX,Status=ACTIVE",
    "Process=1,System=Windows,PID=242,Program=DRMX,Status=ACTIVE",
    "Process=1,System=Linux,PID=246,Program=DRMX,Status=ACTIVE",
    "Process=1,System=Linux,PID=246,Program=DRMX,Status=ACTIVE"].

和:

["Process=1,System=Windows,PID=242,Program=DRMX,Status=STOPPED"].

我找到了使用 re:run/2 和 lists:filter/2 过滤它的可能解决方案。有没有更简单快捷的方法?

Filter=fun(Acc)->
    nomatch =/= re:run(Acc,"Status=ACTIVE") end.
Result=lists:filter(Filter,Programs).

溴,

达米安

标签: listfiltererlang

解决方案


第一个可以通过

lists:filter(
    fun (A) ->
        lists:member("Status=ACTIVE", string:tokens(A,","))
    end, Programs).

而第二个有点复杂,因为它需要验证两个条件:

lists:filter(
    fun(A) ->
        Tokens = string:tokens(A, ","),
        lists:member("Status=STOPPED", Tokens)
        andalso lists:member("System=Windows", Tokens)
    end, Programs).

我不确定它是否更快,但它至少更具可读性。


推荐阅读