如何检查一个单词是否在 Lua 中的字符串中作为一个完整的单词出现

how to check if a word appears as a whole word in a string in Lua

不确定如何检查一个单词是否在字符串中显示为整个单词,而不是单词的一部分,区分大小写。例如:

Play 在字符串中

Info Playlist Play pause

但不在字符串中

Info Playlist pause
Info NowPlay pause

由于 Lua 中没有通常的 \b 单词边界,您可以使用 frontier pattern %f%f[%a] 匹配到字母的过渡,%f[%A] 匹配相反的过渡。

%f[set], a frontier pattern; such item matches an empty string at any position such that the next character belongs to set and the previous character does not belong to set. The set set is interpreted as previously described. The beginning and the end of the subject are handled as if they were the character [=17=].

您可以使用以下 ContainsWholeWord 函数:

function ContainsWholeWord(input, word)
    return string.find(input, "%f[%a]" .. word .. "%f[%A]")
end

print(ContainsWholeWord("Info Playlist pause","Play") ~= nil)
print(ContainsWholeWord("Info Play List pause","Play") ~= nil)

IDEONE demo

要完全模拟 \b 行为,您可以使用

"%f[%w_]" .. word .. "%f[^%w_]"

模式,因为 \b 匹配以下位置:

  • 在字符串的第一个字符之前,如果第一个字符是一个单词([a-zA-Z0-9_])字符。
  • 在字符串的最后一个字符之后,如果最后一个字符是一个单词([a-zA-Z0-9_])字符。
  • 字符串中两个字符之间,其中一个是单词字符([a-zA-Z0-9_]),另一个不是单词字符([^a-zA-Z0-9_])。

请注意 %w Lua 模式与 \w 不同,因为它只匹配字母和数字,但不匹配下划线。

function isWordFoundInString(w,s)
  return select(2,s:gsub('^' .. w .. '%W+','')) +
         select(2,s:gsub('%W+' .. w .. '$','')) +
         select(2,s:gsub('^' .. w .. '$','')) +
         select(2,s:gsub('%W+' .. w .. '%W+','')) > 0
end

print(isWordFoundInString('Play','Info Playlist Play pause'))
print(isWordFoundInString('Play','Info Playlist pause'))
print(isWordFoundInString('Play','Info NowPlay pause'))