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

String 如何检查一个单词在Lua中是否作为整个单词出现在字符串中,string,lua,string-matching,lua-patterns,String,Lua,String Matching,Lua Patterns,不确定如何检查一个单词是否作为整个单词出现在字符串中,而不是单词的一部分,区分大小写。例如: 播放在字符串中 Info Playlist Play pause 但不是在字符串中 Info Playlist pause Info NowPlay pause 由于Lua中没有常见的\b单词边界,因此可以使用%f%f[%a]匹配到字母的转换,%f[%a]匹配到相反的转换 %f[set],一种前沿模式;该项在任何位置匹配空字符串,以便下一个字符属于集合,而上一个字符不属于集合。该集合如前所述进行解释

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

播放
在字符串中

Info Playlist Play pause
但不是在字符串中

Info Playlist pause
Info NowPlay pause

由于Lua中没有常见的
\b
单词边界,因此可以使用
%f
<代码>%f[%a]匹配到字母的转换,
%f[%a]
匹配到相反的转换

%f[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)

要完全模拟
\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
不同,因为它只匹配字母和数字,而不匹配下划线。

为什么不在
信息播放列表暂停中?
?这就是目标。我只希望当“Play”是一个字符串中的一个完整单词,而不是一个单词的一部分时,它才是真的。@Stribizev我看不出这是你标记它的问题的副本-这个问题是关于匹配单词边界的。实际上我甚至不想将它标记为副本,对不起,我只是想显示这个链接。谢谢,但我刚刚意识到问题应该区分大小写,而不是不区分大小写
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'))