我想做的事情非常简单。我想用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
有更高效,更优雅的方式来做同样的工作吗?
答案 0 :(得分: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>
找到:
<integer>
,%-?
)%d+
)%.
)%d+
)并将其替换为第一次捕获(上面1-3的内容)。
请注意,如果您的浮点数不能包含前导数字(例如<integer>.99</integer>
)或科学记数法(例如<integer>1.34e7</integer>
),则此功能无效。
答案 1 :(得分:-2)
那应该做的工作:
s = "<integer>-1.00</integer>"
s:gsub("[.]%d*","")