【问题标题】:Lua pattern to match the path匹配路径的 Lua 模式
【发布时间】:2014-02-21 09:48:55
【问题描述】:

我想取一个代表文件路径的字符串,去掉文件名并只保存路径。

例如,如果我有:

"/folder1/folder2/file.name"

我想在我的字符串中以"/folder1/folder2/" 结尾。

我一直在玩string.match(),如下所述:http://lua-users.org/wiki/StringLibraryTutorial

我有以下代码:

mystring = "/var/log/test.log"
print(string.match(mystring, "%/"))

当我运行这个脚本时,我最终只返回了一个“/”。 我期待它会返回字符串中两个“/”的位置。 我也尝试用"/" 替换模式"%/",但这给了我相同的结果。

我确定我遗漏了一些非常简单的东西,但我看不到它是什么。

【问题讨论】:

    标签: string lua substring lua-patterns


    【解决方案1】:

    通过%// 模式,您告诉string.match 查找字符串/,这就是您得到的。试试这个:

    local mystring = "/var/log/test.log"
    print(string.match(mystring, ".+/"))
    

    这里的模式.+/ 表示查找一个或多个任意字符(.),后跟/+ 表示它是贪婪的,即尽可能长的匹配。

    【讨论】:

    • 不用转义/
    • @lhf 现在已修复,有时我忘记了所有的魔法字符是什么。但是转义 / 也可以,这也是我喜欢 Lua 的原因之一。
    • 在路径中出现转义序列失败。
    【解决方案2】:

    试试这个选项:

    local mystring = "/var/log/test.log"
    print(mystring:gsub('([%w+]+%.%w+)$',''))
    

    输出:/var/log/

    local mystring = "/var/log/test.log"
    print(mystring:match('^(/.+/)'))
    

    输出:/var/log/

    或者太简单的功能

        function anystring(string)
           local string = string:match('^(/.+/)')
           if anystring then
              return string
           else
              return false
           end
        end
    
    local mystring = anystring('/var/log/test.log')
    
    print(mystring)
    

    输出:/var/log/

    放置模式时可以尽可能具体,以避免代码错误

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      相关资源
      最近更新 更多