查找字符串的所有大写字母/小写字母/混合字母组合

我需要用 Lua 为游戏服务器制作这个。。

我想要能够将一个名称的所有组合保存到一个字符串中,然后可以与以下内容一起使用:

if exists (string)

例如:

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

等等

在游戏中,只能使用数字,字母和_ -作为名称。

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

我明白逻辑,但不知道如何编写代码:D

0-Lower
1-Upper

然后

000
001

等等。

点赞
用户1881196
用户1881196

如果您只对 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"))
2015-11-01 16:30:56
用户1881196
用户1881196

你可以使用递归生成器。第一个参数包含到目前为止已生成的字符串的左部分,第二个参数是原始字符串的剩余右部分。

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")

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

2015-11-01 16:49:06
用户3979429
用户3979429

如何做到这一点?

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

首字母大写

您必须基本上,对于每个排列,使其与所有可能的大写字母组合在一起。

这应该不太难,我相信您可以编写它 :)


你在开玩笑吗?

在此之后,您可能会想知道。这真的有必要吗?这好像有点过分!

答案取决于您在做什么。您真的需要给定字符的所有组合吗?我不这么认为。在评论中,您说您需要它以实现不区分大小写...但您是否知道您可以将其转换为小写/大写?这非常简单

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

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


您决定

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

2015-11-01 20:49:51