字符串替换 |
|
在进行字符串搜索和替换时,我们通常不需要 string.gsub 函数提供的正则表达式功能。我用这个新函数进行了一个基准测试,发现它总体上比 gsub 快两倍以上。当对数千条记录的字段值进行搜索和替换时,速度差异非常明显。
我选择将函数命名为 'replace',因为 Python、Ruby 和大多数语言都使用 'replace' 来表示字符串搜索和替换函数。
--Sam Lie
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}
};