查找字符串的所有 upper/lower/mixed 组合

Find all upper/lower/mixed combinations of a string

我需要这个用于使用 Lua 的游戏服务器..

我希望能够保存一个名字的所有组合 变成一个字符串,然后可以用于:

if exists (string)

示例:

ABC_-123    
aBC_-123     
AbC_-123 
ABc_-123     
abC_-123

等等

游戏中只有数字、字母和_ -。可以用作名字。

(A_B-C, A-B.C, AB_8 ... etc)

我理解逻辑我只是不知道如何编码it:D

0-Lower    
1-Upper

然后

000    
001

等等

如果您只对 exists 函数感兴趣,那么您不需要所有组合。

local stored_string = "ABC_-123"

function exists(tested_string)
        return stored_string:lower() == tested_string:lower()
end

您只需以不区分大小写的方式比较存储的字符串和测试的字符串。

可以轻松测试:

assert(exists("abC_-123"))
assert(not exists("abd_-123"))

您可以使用递归生成器。第一个参数是目前生成的字符串的左边部分,第二个参数是原字符串剩下的右边部分。

function combinations(s1, s2)
        if s2:len() > 0 then
                local c = s2:sub(1, 1)
                local l = c:lower()
                local u = c:upper()
                if l == u then
                        combinations(s1 .. c, s2:sub(2))
                else
                        combinations(s1 .. l, s2:sub(2))
                        combinations(s1 .. u, s2:sub(2))
                end
        else
                print(s1)
        end
end

所以函数是这样调用的

combinations("", "ABC_-123")

您只需存储中间结果而不是打印它们。

怎么做?

Lua 中有生成字符串所有排列的本机函数,但这里有一些可能有用的东西。


子串

可能是最简单的解决方案,但也是最不灵活的。您可以检查给定字符串中是否存在子字符串,而不是组合。

if str:find(substr) then
    --code
end

如果这能解决您的问题,我强烈推荐它。


获取所有排列

一个更昂贵但仍然有效的解决方案。这几乎完全符合您的要求。

function GetScrambles(str, tab2)
   local tab = {}
   for i = 1,#str do
      table.insert(tab, str:sub(i, i))
   end
   local tab2 = tab2 or {}
   local scrambles = {}
   for i = 0, Count(tab)-1 do
      local permutation = ""
      local a = Count(tab)
      for j = 1, #tab do
         tab2[j] = tab[j]
      end

      for j = #tab, 1, -1 do
         a = a / j
         b = math.floor((i/a)%j) + 1
         permutation = permutation .. tab2[b]
         tab2[b] = tab2[j]
      end
      table.insert(scrambles, permutation)
   end
   return scrambles
end

你问的

基本上这正是您最初要求的。它与上面的代码相同,除了字符串的每个子字符串。

function GetAllSubstrings(str)
    local substrings = {}
    for i = 1,#str do
        for ii = i,#str do
            substrings[#substrings+1]=str:sub(ii)
        end
    end
    return substrings
end

首都

基本上,对于每一个排列,你都必须用它来进行每一种可能的大写组合。

这应该不会太难,我相信你可以编码:)


你在开玩笑吗?

在这之后你可能会想知道。这一切真的有必要吗?好像有点多!

答案在于你在做什么。您真的需要给定字符的所有组合吗?我不这么认为。你说你需要它在评论中不区分大小写......但是你知道你可以简单地将它转换为 lower/upper 大小写吗?很简单

local str = "hELlO"
print(str:lower())
print(str:upper())

这是您存储名称的方式,否则您应该保持区分大小写。


你来决定

现在你选择你要做什么。无论你选择哪个方向,祝你好运!