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的模式串不能这么弄么 展开
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的模式串不能这么弄么 展开
2个回答
展开全部
这个很简单啊,做字符串匹配。关键你那个替换逻辑有点乱。
【匹配整个单词】
一般你在编辑器中做文本替换,要替换所有 【匹配整个单词】 区分大小写 等选项。
你的那个 屏蔽的单词集合,明显分了两类,但却没有区分。
lua my hello go 等式 精确的单词。比如 go 替换 不可能 替换 bingo 中的 go
主题 你好 等是却要替换 一个完整单词(因为匹配一般是靠空格符号匹配的)的一部分。
比如: 替换 "主题" 会把 "主题曲" 中的部分"主题" 替换
【解决方法】先做 包含中文单词匹配,用空格当然有些bug 还是需要解决的,比如常见的 中文符号,要从匹配中 去除,我给你做个简单 demo。
你自己处理下 标点符号。
【匹配整个单词】
一般你在编辑器中做文本替换,要替换所有 【匹配整个单词】 区分大小写 等选项。
你的那个 屏蔽的单词集合,明显分了两类,但却没有区分。
lua my hello go 等式 精确的单词。比如 go 替换 不可能 替换 bingo 中的 go
主题 你好 等是却要替换 一个完整单词(因为匹配一般是靠空格符号匹配的)的一部分。
比如: 替换 "主题" 会把 "主题曲" 中的部分"主题" 替换
【解决方法】先做 包含中文单词匹配,用空格当然有些bug 还是需要解决的,比如常见的 中文符号,要从匹配中 去除,我给你做个简单 demo。
你自己处理下 标点符号。
追问
追答
这样不是吧 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!
是一个分别处理模式串和非模式串的方法,需要改进中文分词算法
展开全部
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 文件中再运行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询