【问题标题】:lua pattern, exclusion doesn't work with end of stringlua 模式,排除不适用于字符串结尾
【发布时间】:2015-02-02 22:23:38
【问题描述】:

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

[^exclude]

如果字符后面没有任何内容似乎不起作用,即它是字符串中的最后一个字符。

更具体地说,我得到了一个正在运行的进程列表,并试图在内部使用 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

我将从这里提取 PID 用于 kill 命令。我正在运行一个不支持正则表达式或 killall 上的确切选项的 OpenWRT 构建,否则我会这样做。

(%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。

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

【问题讨论】:

  • pgrep 可用吗?它可能会有所帮助。 $ 模式应该匹配。你做比赛的循环代码是什么?
  • 我有 pgrep,似乎不起作用。它返回两个 mpd 进程。我拥有的代码只是一个 javascript 按钮,它向我的 openwrt 路由器发送一个 http 帖子,它具有基于帖子数据的 LUA 交互。所以它本质上只是一个杀死mpd的按钮,但我不想杀死mpd /etc/mpd2.conf,因为那是一个音乐流媒体,我只想杀死本地播放器。我什至没有用它来测试,我只是通过 ssh 进入我的路由器以交互方式运行 LUA。

标签: string lua pattern-matching lua-patterns


【解决方案1】:

给定:

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

【讨论】:

  • 成功了!非常感谢你的帮助!如果我试图理解为什么 [%s]- 似乎表示 0 或 1 个空格,但不确定 [] 是什么,而 $ 表示行尾。
猜你喜欢
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多