我将xml配置文件存储在动态切换的文件夹中。但这种行为是绝对的道路,我需要一条相对的道路。编写的lua代码适用于Windows路径(反斜杠)和mac路径(正斜杠)。
在我的Mac上,路径可能是/folder/folder/profile1.xml。在正常的应用程序中,程序将返回profile1.xml的文件/位置。它会在同一个文件夹中找到下一个配置文件。 如果我使用相对链接(例如../profile2.xml)将应用程序定向到新文件夹,则程序将找到新的配置文件并将文件/位置返回为../profile2.xml。然后它将找不到同一文件夹中的下一个配置文件......它要么在步骤(../)中查找下一个配置文件,要么在应用程序设置的原始文件夹中查找。我希望它在这个新文件夹位置找到下一个请求的配置文件。
设置当前配置文件和配置文件路径的现有代码如下:
local loadedprofile = '' --set by application
local profilepath = '' --set by application and modified below
相关的切换功能似乎是:
local function setDirectory(value)
profilepath = value
end
local function setFile(value)
if loadedprofile ~= value then
doprofilechange(value)
end
end
local function setFullPath(value)
local path, profile = value:match("(.-)([^\\/]-%.?([^%.\\/]*))$")
profilepath = path
if profile ~= loadedprofile then
doprofilechange(profile)
end
我想我可能需要修改第三个函数的匹配条件才能删除../。也许像这样删除可选的。' s
local function setFullPath(value)
local path, profile = value:match("(.-)([^\\/]-([^%.\\/]*))$")
profilepath = path
if profile ~= loadedprofile then
doprofilechange(profile)
end
我真的不知道如何编写这段代码,我只想尝试调整这个开源代码(MIDI2LR)以满足我的需求。在我对代码的基本理解中,似乎匹配标准过于复杂。但我想知道我是否正确阅读。我把它解释为:
:match("(.-)([^\\/]-%.?([^%.\\/]*))$")
(.-) --minimal return
( )$ --from the end of profile path
[^\\/]- --starts with \ or \\ or /, 0 or more occurrences first result
%.? --through, with dots optional
[^%.\\/]* --starts with . or \ or \\ or /, 0 or more occurrences all results
如果我正确地阅读它,它似乎是第一个"以"完全是多余的,或者从最后的#34;应该与第二个"以。"
开头我已经注释掉了setFullPath函数而没有所需的结果,这让我觉得可能需要将匹配要求添加到setDirectory函数中。
任何帮助都非常感谢,因为我在脑海中。谢谢!
答案 0 :(得分:0)
您对比赛的阅读不正确,这是一个更准确的版本:
:match("(.-)([^\\/]-%.?([^%.\\/]*))$")
(.-) -- Match and grab everything up until the first non slash character
( )$ -- Grab everything up until the end
[^\\/]- -- Starts with any character OTHER THAN \ or /, 0 or more occurrences first result
%.? -- single dot optional in the middle of the name (for dot in something.ext)
[^%.\\/]* -- Any character OTHER THAN . or \ or /, 0 or more occurrences
一些注意事项 - %.
是一个字面点。 [^xyz]
是反向类,因此除了x,y或z之外的每个字符。 \\
实际上只是一个反斜杠,这是由于字符串中的转义。
这个更简单的版本会以类似的方式破解它:value:match("(.-)([^\\/]+)$")
您可能希望提供有关配置文件加载行为的更多信息,很难说明您需要代码执行的操作。路径和配置文件在您给出的示例中有什么价值?