猿问

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

比如有个包含子串的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的模式串不能这么弄么




拉丁的传说
浏览 945回答 3
3回答

RISEBY

这个很简单啊,做字符串匹配。关键你那个替换逻辑有点乱。【匹配整个单词】一般你在编辑器中做文本替换,要替换所有 【匹配整个单词】 区分大小写 等选项。你的那个 屏蔽的单词集合,明显分了两类,但却没有区分。lua my hello go 等式 精确的单词。比如 go 替换 不可能 替换 bingo 中的 go主题 你好 等是却要替换 一个完整单词(因为匹配一般是靠空格符号匹配的)的一部分。比如: 替换 "主题" 会把 "主题曲" 中的部分"主题" 替换【解决方法】先做 包含中文单词匹配,用空格当然有些bug 还是需要解决的,比如常见的 中文符号,要从匹配中 去除,我给你做个简单 demo。你自己处理下 标点符号。

至尊宝的传说

1234567891011121314151617181920212223242526272829303132333435-----&nbsp;function&nbsp;maskMsg&nbsp;takes&nbsp;string,&nbsp;table,&nbsp;string&nbsp;returns&nbsp;string----&nbsp;@text&nbsp;&nbsp;&nbsp;&nbsp;预处理的文本--&nbsp;@set&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;预搜索的子串集合--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;@repl&nbsp;&nbsp;&nbsp;&nbsp;替换的文本--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不指定则替换成&nbsp;与字符串长度相等的&nbsp;"*"----&nbsp;@return&nbsp;&nbsp;处理后的文本&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;function&nbsp;maskMsg&nbsp;(&nbsp;text,&nbsp;set,&nbsp;repl&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;#text&nbsp;<=&nbsp;0&nbsp;&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;text&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;function&nbsp;maskor&nbsp;(&nbsp;str&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;repl&nbsp;or&nbsp;string.rep(&nbsp;"*",&nbsp;#str&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;k,&nbsp;str&nbsp;in&nbsp;pairs(set)&nbsp;do&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;=&nbsp;string.gsub(&nbsp;text,&nbsp;str,&nbsp;maskor(str)&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;textend&nbsp;--&nbsp;&nbsp;对给定文本中出现的&nbsp;给定集合中的子串进行替换text&nbsp;=&nbsp;"lua&nbsp;is&nbsp;my&nbsp;style!&nbsp;hello&nbsp;boy&nbsp;,let`s&nbsp;go,我们的主题曲!&nbsp;Bingo!"wordLib&nbsp;=&nbsp;{"lua","my","hello","go","主题","你好"}local&nbsp;function&nbsp;main&nbsp;()&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;msg&nbsp;=&nbsp;maskMsg&nbsp;(&nbsp;text,&nbsp;wordLib,&nbsp;"**")&nbsp;&nbsp;&nbsp;&nbsp;print(msg)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endmain()---&nbsp;输出结果--&nbsp;&nbsp;**&nbsp;is&nbsp;**&nbsp;style!&nbsp;**&nbsp;boy&nbsp;,let`s&nbsp;**,我们的**曲!&nbsp;Bin**!【注:】【1】上面这个demo 是效率很低很低的方法。【2】附件:简单屏蔽指定集合中的单词(含中文)- flameleo.lua12---&nbsp;输出结果--&nbsp;&nbsp;**&nbsp;is&nbsp;**&nbsp;style!&nbsp;**&nbsp;boy&nbsp;,let`s&nbsp;**,我们的**曲!&nbsp;Bingo!是一个分别处理模式串和非模式串的方法,需要改进中文分词算法&nbsp;
随时随地看视频慕课网APP
我要回答