如何在Lua中检查字符串中是否存在匹配的文本?

88

我需要制作一个条件判断,当在文本字符串中至少找到一次特定匹配文本时为真,例如:

str = "This is some text containing the word tiger."
if string.match(str, "tiger") then
    print ("The word tiger was found.")
else
    print ("The word tiger was not found.")

如何检查字符串中是否包含某个文本?

1个回答

149

有两种方法可以找到匹配的文本; string.match 或者 string.find

这两种方法都会对字符串执行 Lua patten 搜索以查找匹配项。


string.find()

string.find(subject string, pattern string, optional start position, optional plain flag)

返回找到的子字符串的 startIndexendIndex

plain 标记允许忽略模式,并将其解释为文字。 而不是将(tiger)解释为匹配tiger的模式捕获组,它会在字符串中查找(tiger)

如果您想进行模式匹配,但仍要使用特殊字符(例如.()[]+-等)的文字表示,则可以使用百分号对它们进行转义;%(tiger%)

您可能会与string.sub结合使用此方法

示例

str = "This is some text containing the word tiger."
if string.find(str, "tiger") then
  print ("The word tiger was found.")
else
  print ("The word tiger was not found.")
end

string.match()

string.match(s, pattern, optional index)

返回找到的捕获组。

示例

str = "This is some text containing the word tiger."
if string.match(str, "tiger") then
  print ("The word tiger was found.")
else
  print ("The word tiger was not found.")
end

13
使用语法糖str:find("tiger") - Ciprian Tomoiagă
8
对于简单的例子“tiger”,这个方法可以有效运行,但是有许多可能被解释为模式而非字面字符串并会破坏代码的搜索字符串。请考虑更新以上示例以支持搜索字符串“tiger(”。 - Nathan Wiebe
@NathanWiebe 没错。由于这似乎是一个广泛流行的答案,我已经添加了一个相应的部分。请随意进一步扩展它 :) - hjpotter92
4
即使转义匹配模式字符,仍然不能处理任意搜索字符串的情况 - 一个真正任意的字符串(非硬编码),可能包含您无法转义的特殊字符。理想情况下,答案应该引导读者查看可选的第四个参数,该参数可以禁用模式搜索。例如:string.find(myArbitraryString,myArbitrarySearchString,1,true),对于运行时可能遇到的任何myArbitrarySearchString值都有效,包括值“tiger(”。 - Nathan Wiebe
4
string.find()有第四个参数plain,当设置为true时,将把第二个参数视为普通字符串。尽管('aa+bb'):find('a + b')返回nil(无匹配项),但('aa+bb'):find('a + b',1,true)返回2,4(找到一次匹配)。 - Feuermurmel
@NathanWiebe 谢谢,正是我需要的 :) - SebMa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接