字符串替换

lua-users home
wiki

快速非正则表达式字符串搜索和替换函数

在进行字符串搜索和替换时,我们通常不需要 string.gsub 函数提供的正则表达式功能。我用这个新函数进行了一个基准测试,发现它总体上比 gsub 快两倍以上。当对数千条记录的字段值进行搜索和替换时,速度差异非常明显。

我选择将函数命名为 'replace',因为 Python、Ruby 和大多数语言都使用 'replace' 来表示字符串搜索和替换函数。

--Sam Lie


将以下函数添加到 Lua 中的 string 库文件。

static int str_replace(lua_State *L) {
    size_t l1, l2, l3;
    const char *src = luaL_checklstring(L, 1, &l1);
    const char *p = luaL_checklstring(L, 2, &l2);
    const char *p2 = luaL_checklstring(L, 3, &l3);
    const char *s2;
    int n = 0;
    int init = 0;

    luaL_Buffer b;
    luaL_buffinit(L, &b);

    while (1) {
        s2 = lmemfind(src+init, l1-init, p, l2);
        if (s2) {
            luaL_addlstring(&b, src+init, s2-(src+init));
            luaL_addlstring(&b, p2, l3);
            init = init + (s2-(src+init)) + l2;
            n++;
        } else {
            luaL_addlstring(&b, src+init, l1-init);
            break;
        }
    }

    luaL_pushresult(&b);
    lua_pushnumber(L, (lua_Number)n);  /* number of substitutions */
    return 2;
}

/* note: add new the 'replace' function to strlib  */

static const luaL_reg strlib[] = {
    {"len", str_len},
    {"sub", str_sub},
    {"lower", str_lower},
    {"upper", str_upper},
    {"char", str_char},
    {"getchar", str_getchar},
    {"rep", str_rep},
    {"byte", str_byte},
    {"format", str_format},
    {"dump", str_dump},
    {"find", str_find},
    {"gfind", gfind},
    {"gsub", str_gsub},
    {"replace", str_replace},
    {NULL, NULL}
};

最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2007 年 1 月 6 日下午 7:27 GMT (差异)