为何Lua中两次string.find调用失败,第三次却成功?
问题原因分析
按照Lua的string.find默认行为(模式匹配),你给出的三个调用都应该能匹配到目标字符串中的对应子串并返回位置,而不是返回false(Lua中匹配失败实际返回nil,你可能将其误判为false)。出现你描述的差异,大概率是以下几种情况之一:
- 搜索串存在笔误:比如你在前两个搜索串中错误地添加了多余的转义符
%,或者写错了字符——例如把MOZ-MAIL-写成了MOZ%MAIL-(多了%),导致搜索内容和目标字符串不匹配;而第三个搜索串没有笔误,所以能正常匹配。 - 目标字符串与描述不符:比如目标字符串实际是
MOZ_MAIL-1-1(下划线代替了减号),前两个搜索串中的减号无法匹配下划线;或者目标字符串存在大小写差异(比如小写的moz-mail-1-1),而前两个搜索串是大写,第三个恰好匹配了对应大小写的子串。 - Lua模式匹配规则误解:虽然
-在Lua模式中只有在字符类[]内才是特殊字符(用于定义字符范围,比如[a-z]),但如果你错误地将其当作正则中的特殊字符进行转义,可能导致搜索串被错误解析——比如误写为MOZ%-MAIL-,则会搜索MOZ%MAIL-,而目标字符串中没有%,自然匹配失败。
如果需要彻底避免模式匹配的干扰,可以使用string.find的第三个参数true强制进行字面量匹配,示例:
-- 强制字面量匹配,无需考虑模式特殊字符 string.find("MOZ-MAIL-1-1", "MOZ-MAIL-", true)
内容的提问来源于stack exchange,提问作者Paul Eden
相关产品推荐
相关产品推荐

