Lua 语言如何替换多个可选字符串

比如有个包含子串的table:wordLib={"lua","my","hello","go","主题","你好"}有个字符串txt="luaismystyle!hell... 比如有个包含子串的table :

wordLib = {"lua","my","hello","go","主题","你好"}

有个字符串txt = "lua is my style! hello boy ,let`s go,我们的主题曲!"
只要wordLib包含了的子串,都替换为" ** ";
比如结果应该是:** is ** style!** boy,let`s **,我们的**曲!
没分了,高手帮帮忙吧
用其他语言里正则式是可以做到的
比如有个词库包含了 go ,主题曲,my end 四个子串,不一定是单词哦
把字符串中含有子串的部分替换成 **
现有一句话:我们的主题曲开播了,let`s go,my friends,好吧bingo!
替换后可以为:我们的**开播了,let`s **,**fri**s,好吧bin**!
其他语言实现的效果如下图:

是lua的模式串不能这么弄么
展开
 我来答
flameleo11
2013-08-07 · TA获得超过5343个赞
知道大有可为答主
回答量:1943
采纳率:50%
帮助的人:997万
展开全部
这个很简单啊,做字符串匹配。关键你那个替换逻辑有点乱。

【匹配整个单词】
一般你在编辑器中做文本替换,要替换所有 【匹配整个单词】 区分大小写 等选项。

你的那个 屏蔽的单词集合,明显分了两类,但却没有区分。

lua my hello go 等式 精确的单词。比如 go 替换 不可能 替换 bingo 中的 go

主题 你好 等是却要替换 一个完整单词(因为匹配一般是靠空格符号匹配的)的一部分。
比如: 替换 "主题" 会把 "主题曲" 中的部分"主题" 替换

【解决方法】先做 包含中文单词匹配,用空格当然有些bug 还是需要解决的,比如常见的 中文符号,要从匹配中 去除,我给你做个简单 demo。
你自己处理下 标点符号。
追问

多谢回答,以上的替换思路不混乱呀,用其他语言里正则式是可以做到的

比如有个词库包含了    go ,主题曲,my  end  四个子串,不一定是单词哦

把字符串中含有子串的部分替换成 **

现有一句话:我们的主题曲开播了,let`s go,my friends,好吧bingo!

替换后可以为:我们的**开播了,let`s **,**fri**s,好吧bin**!

效果如下图:

是lua的模式串不能这么弄么

追答

这样不是吧 bingo 这个单词破坏了吗?

我看你的意思也就是 简单搜索下,那这种在lua中就更容易了。

---
-- function maskMsg takes string, table, string returns string
--
-- @text    预处理的文本
-- @set     预搜索的子串集合
--           
-- @repl    替换的文本
--          不指定则替换成 与字符串长度相等的 "*"
--
-- @return  处理后的文本
       
local function maskMsg ( text, set, repl )
    if #text <= 0  then
        return text
    end
    local function maskor ( str )
        return repl or string.rep( "*", #str )
    end
    for k, str in pairs(set) do
        text = string.gsub( text, str, maskor(str) )
    end
    return text
end

--  对给定文本中出现的 给定集合中的子串进行替换
text = "lua is my style! hello boy ,let`s go,我们的主题曲! Bingo!"
wordLib = {"lua","my","hello","go","主题","你好"}
local function main ()
    local msg = maskMsg ( text, wordLib, "**")
    print(msg)
    
end
main()
--- 输出结果
--  ** is ** style! ** boy ,let`s **,我们的**曲! Bin**!

【注:】
【1】上面这个demo 是效率很低很低的方法。

【2】附件:简单屏蔽指定集合中的单词(含中文)- flameleo.lua

--- 输出结果
--  ** is ** style! ** boy ,let`s **,我们的**曲! Bingo!

是一个分别处理模式串和非模式串的方法,需要改进中文分词算法

 

不知详解
2013-08-07 · 知道合伙人软件行家
不知详解
知道合伙人软件行家
采纳数:609 获赞数:2252
自学计算机。

向TA提问 私信TA
展开全部

lua 有个 string.gsub 函数,用来完成替换功能。

使用循环。


txt="lua is my style! hello boy ,let`s go,我们的主题曲!"
wordLib = {"lua","my","hello","go","主题","你好"} 
function string.gsub_tab(txt,tab,str)
res=txt
for i,v in ipairs(tab) do
res=string.gsub(res,v,str)
end
return res
end
print (string.gsub_tab(txt,wordLib," ** "))


以上代码的,string.gsub_tab() 函数 就提供了你需要的功能。

以上代码应该写入 lua 文件中再运行。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式