检查一组字符中特定位置是否匹配特定值

我有一个由字母组成的字符串,例如YYYNNN等,我想要测试,比如第一个字符是否为Y,或者中间字符是否为Y

这需要在不同的行上多次进行检查,以检查不同的值。

我已经有一个可行的解决方案(感谢 这里):

matchCode1 = 'YYY'

function set(...)
   local ret = {}
   for _,k in ipairs({...}) do ret[k] = true end
   return ret
end

if set('YYY', 'YYN', 'YNY', 'YNN')[matchCode1] then
   print('true')
else
  print('false')
end

我只是想知道是否有更简单的方法,因为我只需要检查(在这种情况下)字符串中的第一个字母是否为Y

matchCode1可以是任何由YN组成的组合,但始终为3个字符。

我将检查的其他情况是第二个字符是否为Y,第三个字符是否为Y以及是否全部为Y

点赞
用户7396148
用户7396148

你可以使用 string.findstring.find 会采用 Lua 模式并在给定字符串中查找匹配项,它将返回字符的索引。

这个例子只查找第一个 Y

function checkMatchCode(code)
  startIndex = code:find('Y')

  if startIndex == 1 or startIndex == 2 then
    print(code .. ': true')
  else
    print(code .. ': false')
  end
end

checkMatchCode('YYY')
checkMatchCode('YNY')
checkMatchCode('NYY')
checkMatchCode('NYN')
checkMatchCode('NNY')
checkMatchCode('NNN')

输出:

YYY: true
YYN: true
YNY: true
NYY: true
NYN: true
NNY: false
NNN: false

你也可以类似地使用 string.gmatch 创建匹配结果的表格。

这个例子检查字符串中每个字符是否为 Y

function checkMatchCode(code)
  local results = {}

  for char in code:gmatch('.') do
    local charPosition = #results + 1
    if char == 'Y' then
      results[charPosition] = true
    else
      results[charPosition] = false
    end
  end

  if results[1] and results[2] then -- using an and here to show the difference
    print(code .. ': true')
  else
    print(code .. ': false')
  end
end

checkMatchCode('YYY')
checkMatchCode('YNY')
checkMatchCode('NYY')
checkMatchCode('NYN')
checkMatchCode('NNY')
checkMatchCode('NNN')

输出:

YYY: true
YYN: true
YNY: false
NYY: false
NYN: false
NNY: false
NNN: false

如果你关心匹配多个字符或者需要一个表格来操作匹配结果的话, string.gmatch 是一种更强大的选项。

string.find 是一种快速检查方法,可以告诉你是否至少有一个 Y,以及 Y 的位置在哪里,它不关心是否有 1 个或 3 个 Y,你只能得到第一个匹配项的信息。

2019-06-19 14:26:22