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

标签 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。

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

最佳答案

给定:

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 根 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

关于string - lua 模式,排除不适用于字符串结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27304198/

相关文章:

r - 向字符串/字符向量中的每个元素添加可变长度填充

C++ 显示具有 vector 的 map

在 C 中更改字符串数组中的字符

F# 对具有类型约束的泛型类进行模式匹配

java - 如何通过 while 循环一次处理输入一个数字

lua - 如何从十进制数中删除点符号?

lua - 尝试将 nil 与数字堆栈回溯进行比较?

lua - 删除lua中的self

regex - 按特定模式对文本文件中的列重新排序

java - 用文件中的数据填充 java hashmap