【问题标题】:Reverse string.find() or string.gmatch in Lua?在 Lua 中反转 string.find() 或 string.gmatch?
【发布时间】:2012-02-23 19:11:30
【问题描述】:

我有一个包含如下内容的字符串:

##### abc 'foo'
/path/to/filename:1
##### abc 'bar'
/path/to/filename:1

字符串可能很长(比如 50 行)并且不会经常更改。

我想获取单引号之间最后出现的文本(本例中为bar)。这类似于其他人的 Python problem(除了那里的答案在 Lua 中对我不起作用,如下所示)。

我可以解析每一行,并将结果放入一个数组中,然后只取数组的最后一个元素,但这对我来说似乎并不优雅:

本地文本 = [[ ##### abc 'foo' /路径/到/文件名:1 ##### abc '酒吧' /路径/到/文件名:1 ]] 本地 arr = {} 本地模式 = "abc '([^']+)'" 对于文本中的 s:gmatch(pattern) 做 table.insert(arr, s) 结尾 打印('最后一个:',arr [#arr])

我对使用 Lua 字符串模式从末尾搜索字符串很感兴趣。我在下面尝试的模式从头而不是尾开始:

本地文本 = [[ ##### abc 'foo' /路径/到/文件名:1 ##### abc '酒吧' /路径/到/文件名:1 ]] -- FIXME:从头开始搜索模式 本地模式 = "abc '([^']+)'.*$" 本地 s = 文本:gmatch(模式)() assert(s == 'bar', '预期为 "bar" 但看到 "'..s..'"') 打印('最后一个:',s)

这会产生:

输入:12:预期为“bar”,但看到“foo”

什么字符串模式指定了我正在寻找的“反向搜索”?

【问题讨论】:

    标签: lua


    【解决方案1】:

    你可以使用

    local pattern = ".*abc '([^']+)'"
    

    .* 是贪婪的,所以它会在匹配之前尽可能多地咀嚼(在这种情况下,它会咀嚼所有之前的匹配并给你最后一个)。

    或者如果你真的想要,你也可以反转你的字符串和(某种)你的模式,但我认为最好依靠贪婪的.*:P

    pattern = "'([^']+)' cba"
    print(text:reverse():gmatch(pattern)())           -- rab
    print(text:reverse():gmatch(pattern)():reverse()) -- bar
    

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 2017-08-08
      • 2015-03-13
      • 1970-01-01
      • 2013-11-23
      • 2017-03-01
      • 1970-01-01
      • 2011-03-12
      • 2016-02-13
      相关资源
      最近更新 更多