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

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

Play 在字符串中出现

Info Playlist Play pause

但不在以下字符串中出现

Info Playlist pause
Info NowPlay pause
点赞
用户3832970
用户3832970

由于 Lua 中没有通常的 \b 单词边界,因此可以利用 frontier pattern %f%f[%a] 匹配到字母转换,而 %f[%A] 匹配到相反的转换。

%f[set] 是一个 frontier 模式,该项匹配为空字符串,位置在集合中的下一个字符,前一个字符不属于集合。 set 集合的解释如上所述。主题的开始和结尾被处理为字符 \0

你可以使用下面的 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 不同,因为它只匹配字母和数字,而不匹配下划线。

2015-09-29 21:47:28
用户3735873
用户3735873
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')) // true
print(isWordFoundInString('Play','Info Playlist pause')) // false
print(isWordFoundInString('Play','Info NowPlay pause')) // false
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')) // true
print(isWordFoundInString('Play','Info Playlist pause')) // false
print(isWordFoundInString('Play','Info NowPlay pause')) // false
2015-09-29 22:40:09