【问题标题】:Lua: How to start match after a characterLua:如何在一个字符之后开始匹配
【发布时间】:2016-08-05 16:55:21
【问题描述】:

我正在尝试创建一个搜索功能,允许您在插入 | 时将搜索分成两部分。字符并根据您输入的内容进行搜索。

到目前为止,我已经了解了如何通过在空格之前捕获来保留主命令。

例如,如果我输入 :ban user,下面的框仍会显示 :ban,但当我输入 | 时,它会重新开始搜索。

:ba
:ba

:ban user|:at
:at

:ban user|:attention members|:kic
:kic

这段代码:

text=":ban user|:at"
text=text:match("(%S+)%s+(.+)")
print(text)

仍会返回禁令。

【问题讨论】:

  • 感谢您的快速修补!
  • 我只是不明白您希望通过":ban user|:at" 输入获得什么::atat?见ideone.com/NJlJM3
  • 我正试图在决赛后获得一场比赛 |字符。
  • 那我猜你需要text=text:match(".*%|(.*)")
  • 好吧,似乎设法通过使用两个 :matches 来获得它。 a = string:match(".*%|(.*)") a = a:match("(%S+)%s+(.+)")关于压缩的任何想法?

标签: lua pattern-matching string-matching


【解决方案1】:

我试图在决赛后获得一场比赛 |字符。

然后就可以使用了

text=":ban user|:at"
new_text=text:match("^.*%|(.*)") 
if new_text == nil then new_text = text end
print(new_text)

Lua demo

解释

  • .* - 匹配任何 0+ 个字符尽可能多(以“贪婪”的方式,因为整个字符串被抓取,然后发生回溯以找到...)
  • %| - 最后一个文字 |
  • (.*) - 匹配并捕获任何 0+ 个字符(直到字符串的末尾)。

【讨论】:

  • Lua 模式的问题是你不能定义一个可选的序列。因此,我们需要在这里使用if-elsenew_text 变量来在返回nil 时恢复原始text 值。
  • 好吧,听起来很合理,可以。此外 Lua 是一个足够快的引擎。 :d,谢谢。
【解决方案2】:

为避免特殊情况,请确保字符串始终包含|

function test(s)
    s="|"..s
    print(s:match("^.*|(.*)$"))
end

test":ba"
test":ban user|:at"
test":ban user|:attention members|:kic"

【讨论】:

  • | 之前添加s 是一个聪明的举措。
  • @WiktorStribiżew,许多使用分隔符的模式匹配问题都可以从这种统一性中受益。见stackoverflow.com/a/35826360/107090
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多