检查包含从表格中获取的项目的字符串

如果 FirstName:GetValue() 等于""或者 table.HasValue( Blocked, string.lower(FirstName:GetValue())),那么检查名字是否包含任何“坏”单词,或者没有输入任何东西。此时 FirstNameCHECK 为 false, text4 显示“Bad Name”,颜色为红色。否则,FirstNameCHECK 为 true, text4 显示“Good Name”,颜色为绿色。

该代码目前检查字符串是否与表中的条目完全相同。如何更改代码以便检查插入的字符串(FirstName 变量)是否包含表中的条目之一?

点赞
用户577603
用户577603

一个低效的解决方案是遍历表格并在每个元素上调用 string.find。这种方法对于非常大的表格可能会变得相当慢,因为你必须检查每个元素,但是除非你正在处理真正的大型数据集,否则这种方法可能完全没问题。

更聪明的方法是使用由子字符串索引的嵌套表格。例如,你可以有一个根索引为 az 的表格。你使用你的单词的第一个字母作为索引进入该表格,然后你会得到另一个相同结构的表格。这个表格使用第二个字母作为索引,直到你要么没有找到正在检查的字母的表格,要么到达了单词的末尾。在后一种情况下,你可能需要在该表格中添加一个额外的唯一条目,用来说明你要查找的单词是否在表格中(因为没有更多的字母,你需要以某种方式进行检查)。

这种方法有几个缺点。建立表格可能在内存上非常密集,而且执行检查可能比对较小的表格的天真方法慢得多。此外,操作查找表格并不那么直接(例如,考虑从中删除单词)。因此,这种结构仅在执行查找时真正有用,你应该在其他任务中使用普通表格。

例如,你可能想在查找表格中维护一个对真实数据表中条目的引用列表,这样你可以从特定的前缀字符串中获取所有匹配的数据表中的条目。

2015-01-27 19:42:06
用户4261756
用户4261756

在另一个问题中解决了这种情况的解决方案(适用于多维表)- Loop until find 2 specific values in a table?

函数MultiTableSearch(输入,值,大小写,索引检查)
    ifinput and typeinput)== 'table'then
        iftype(value)== 'table' and value == inputthen
            return true;
        结束
        对于键,对象中的对象进行循环 do
            如果(index_check)then
                如果(大小写和类型输入 =='string'和类型键 =='string'then
                    如果(value:lower()==键:lower())then  - 避免退出循环
                        返回真;
                    结束
                否则
                    如果(键==值)then
                        返回真
                    elseiftype(object)== 'table'then
                        返回MultiTableSearch(object,value,case,index_check)
                    结束
                结束
            否则
                如果(case和type(value)=='string'type(object)=='string'then
                    如果(value:lower()== object:lower())then
                        返回真;
                    结束
                elseiftype(object)=='table'then
                    如果(value == object)then
                        返回真;
                    else
                        返回MultiTableSearch(object,value,case)
                    结束
                否则
                    如果(对象==值)then
                        返回真;
                    结束
                结束
            结束
        结束
    结束
    返回false;
结束

使用调用此

MultiTableSearch(blocked,FirstName:GetValue(),true) - 表,名称,案例(真正忽略情况)
2015-01-29 17:02:42