4

我想做的事

我想要做的真的很简单。我想使用 Lua 检查 Plist 文件中的行。

假设如果 Plist 中的一行是<integer>-1.00</integer>,我需要切断.00它以使其成为<integer>-1</integer>

我做了什么

我使用一个函数来读取整个文件内容并逐行检查和替换。

local function doLineClean( cont )
    newcont = ''
    string.gsub( cont, "(.-)\r?\n", function(line)
        if string.match( line, "<integer>.-<%/integer>" ) then
            string.gsub( line, "<.->(.-)<.->", function(v)
            a, b = string.find(v,"%..*")
            if a and b then
                v = string.sub( v, 0, a - 1 )
            end
            line = "\t\t<integer>"..v.."</integer>"
            end  )
        end
        newcont = newcont .. line .. '\n'
    end  )
    return newcont
end

我的问题

有没有更高效、更优雅的方式来完成同样的工作?

4

2 回答 2

7

首先,注意 Lua 的字符串模式不是完整的正则表达式。它们更有限,功能更弱,但通常足够(如本例所示)。

为什么不采用更简单的替代方法,例如以下?

local s1 = [[
<integer>3</integer>
<integer>3.12</integer>
<integer>-1.00</integer>
<integer>-1.99</integer>
<float>3.14</float>
]]

local s2 = s1:gsub('(<integer>%-?%d+)%.%d+','%1')
print(s2)
--> <integer>3</integer>
--> <integer>3</integer>
--> <integer>-1</integer>
--> <integer>-1</integer>
--> <float>3.14</float>

这发现:

  1. 文字<integer>
  2. 可选地后跟文字连字符 ( %-?)
  3. 后跟一个或多个数字字符 ( %d+)
  4. 后跟一个文字句点 ( %.)
  5. 后跟一个或多个数字字符 ( %d+)

并将其替换为第一个捕获(上面 1-3 的内容)。

<integer>.99</integer>请注意,如果您的浮点数没有前导数字(例如)或科学记数法(例如) ,这将不起作用<integer>1.34e7</integer>

于 2014-01-02T03:36:50.500 回答
-2

那应该做的工作:

s = "<integer>-1.00</integer>"
s:gsub("[.]%d*","")
于 2014-01-02T03:42:25.670 回答