高效地拆分字符串

由于日志解析,我有一个包含主机名和偶尔 IP 地址的字段。我需要进一步处理该字段中的数据以从主机名中解析域名。例如,如果主机名是 googleanalytics.google.com,我希望尽可能高效地从中解析出 google.com,因为系统每秒处理数千条日志消息。

我目前的做法如下:

-- 将主机名保存到临时变量中
local tempMetaValue = hostname

local count = 0
local byte_char = string.byte(".")
for i = 1, #tempMetaValue do
    if string.byte(tempMetaValue, i) == byte_char then
        count = count + 1
    end
end

local dotCount = count

-- 如果只有一个句点,则不执行任何操作
if dotCount == 1 then
    return 0

-- 检查是否有多个句点
elseif dotCount == 2 then
    -- 获取第一个句点的索引
    local beginIndex = string.find(tempMetaValue,".",1,true)
    -- 获取从第一个句点开始的子字符串
    local domainMeta = string.sub(tempMetaValue,beginIndex+1)
    -- 再次检查子字符串是否存在
    if domainMeta ~= nil then
        -- 填充域元数据字段
    end
-- 如果有多于两个句点...
elseif dotCount > 2 then
    -- 检查主机名是否实际上是 IP 地址
    if tempMetaValue:match("%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?") then
        -- 如果找到了 IP 地址,则跳过其余步骤
    end
    -- 获取倒数第二个句点的索引
    local beginIndex = string.find(tempMetaValue,"\.[^\.]*\.[^\.]*$")
    -- 获取从倒数第二个句点开始的子字符串
    local domainMeta = string.sub(tempMetaValue,beginIndex+1)
    -- 再次检查子字符串是否存在
    if domainMeta ~= nil then
        -- 填充域元数据字段
    end
end

然而,我觉得这可能不是最快的解决方案。 "可能不是",因为在此之前,我没有 Lua 的任何经验,但是对于这样一个简单的任务来说,它似乎过于冗长。

我试图创建一个类似于 Java 中的 split 操作的解决方案,其中它会将最后一个标记“unsplit”,从而让我留下我实际想要的部分(域名)。因此,对于该解决方案,我希望创建与主机名值中的句点数相同的标记,即 googleanalytics.google.com 将被拆分为“googleanalytics”和“google.com”。

点赞
用户258523
用户258523

以下是中文翻译,并保留原始的 markdown 格式:

function getdomain(str)
    -- 取出字符串中最后两个点分隔的部分。
    local domain = str:match("%.?([^.]+%.[^.]+)$")
    -- 如果该部分所有字符都是数字则认为是 IP 地址。
    if domain and tonumber((domain:gsub("%.", ""))) then
        return nil
    end
    return domain
end

print(getdomain("googleanalytics.google.com"))
print(getdomain("foobar.com"))
print(getdomain("1.2.3.4"))
print(getdomain("something.else.longer.than.that.com"))
print(getdomain("foobar"))

这个“是否为 IP 地址”的测试非常简单,很可能需要进行更加健壮的测试,但对于快速演示来说,它已经足够了。

2015-02-09 13:34:53