lua模式,排除不适用于字符串结尾

时间:2014-12-04 21:13:42

标签: string lua pattern-matching lua-patterns

也许排除不是正确的术语,但我在谈论在lua的string.find()函数中使用以下内容:

[^exclude]

如果角色后面没有任何内容,它似乎无法工作,IE它是字符串中的最后一个字符。

更具体地说,我正在获取正在运行并尝试使用LUA内部解析它们的进程列表。

root@OpenWrt:/# ps | grep mpd
 5427 root     21620 S    mpd /etc/mpd2.conf
 5437 root     25660 S    mpd

如果我每次都能期待\ n,那么这不会成为一个问题,但有时ps并没有列出自己产生这个问题。我想要匹配:

5437 root     25660 S    mpd

由此我将为kill命令提取PID。我运行的OpenWRT版本不支持killall上的正则表达式或精确选项,否则我就是这样做的。

(%d+ root%s+%d+ S%s+mpd[^ ])

不幸的是,上述模式不起作用。这是因为在我认为的最后一行中的最后一个字符之后没有字符。我也试过这些:

(%d+ root%s+%d+ S%s+mpd$)

上述模式返回nil。

(%d+ root%s+%d+ S%s+mpd[^ ]?)

上述模式返回第一个过程(5427)

也许有更好的方法可以解决这个问题,或者只是简单的模式改变我可以让它发挥作用,但我似乎无法找到一个只能抓住正确过程的模式。因为它们是可变的,所以我不能使用PID或VSZ。也许我必须看看我是否可以用更好的killall支持来编译OpenWRT。

无论如何,感谢您花时间阅读本文,如果这是重复的,我很抱歉,但我找不到与我的困境类似的任何内容。非常感谢任何建议!

1 个答案:

答案 0 :(得分:4)

假设:

local s = [[5427 root     21620 S    mpd /etc/mpd2.conf
5437 root     25660 S    mpd]]

以下模式

string.match(s,"(%d+)%s+root%s+%d+%s+S%s+mpd[%s]-$")

返回: 5437 root 25660 S mpd

而这:

string.match(s,"(%d+%s+root%s+%d+%s+S%s+mpd[%s]%p?[%w%p]+)")

返回:

5427 root 21620 S mpd /etc/mpd2.conf