我想做的事 我想做的事情非常简单.我想用Lua来检查Plist文件中的行. 假设如果Plist中的一行是整数 -1.00 / integer,我需要将.00关闭以使其为 integer -1 / integer. 我做了什么 我使用函数来读取整
我想做的事情非常简单.我想用Lua来检查Plist文件中的行.
假设如果Plist中的一行是<整数> -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
我的问题
是否有更高效,更优雅的方式来完成同样的工作?
首先,请注意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>
这发现:
>文本<整数>,
>可选后跟一个文字连字符(% – ?)
>后跟一个或多个数字字符(%d)
>后跟一个文字句点(%.)
>后跟一个或多个数字字符(%d)
并将其替换为第一次捕获(上面1-3的内容).
请注意,如果您的浮点数不能包含前导数字(例如<整数> .99< / integer>)或科学记数法(例如< integer> 1.34e7< / integer>),则无法使用此功能.