如何检查一个单词是否在Lua中的字符串中显示为整个单词

时间:2015-09-29 19:51:03

标签: string lua string-matching lua-patterns

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

Play在字符串中

Info Playlist Play pause

但不在字符串中

Info Playlist pause
Info NowPlay pause

2 个答案:

答案 0 :(得分:6)

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

  

%f[set]前沿模式;这样的项匹配任何位置的空字符串,使得下一个字符属于set,而前一个字符不属于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不同,因为它只匹配字母和数字,但不匹配下划线。

答案 1 :(得分:2)

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