在Lua中,有一种高效而优雅的方法可以截断类似于这样的数字吗?

我想做什么

我想做的非常简单。我想用 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

我的问题

有没有更有效和更优雅的方法做同样的工作?

点赞
用户405017
用户405017

首先,注意 Lua 的字符串模式不是完整的正则表达式。它们更为有限和 less powerful,但通常足够使用(就像这种情况)。

为什么不使用一个更简单的替换,如下所示?

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-02 03:36:50
用户1560049
用户1560049

以下是翻译:

这应该可以解决问题:

s = "-1.00" s:gsub("[.]%d*","")

```

2014-01-02 03:42:25