Как проверить, появляется ли слово как целое слово в строке в Lua
Не знаете, как проверить, появляется ли слово как целое слово в строке, а не как часть слова, с учетом регистра. например:
Play
в строках
Info Playlist Play pause
но не в строках
Info Playlist pause
Info NowPlay pause
2 ответа
Так как нет обычного \b
Граница слова в Lua, вы можете использовать шаблон границы %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)
Посмотреть демо IDEONE
Чтобы полностью подражать \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'))