使用string.find()方法查找'.'

12
我正在尝试进行简单的字符串操作:获取文件名,不包括扩展名。 但是,string.find() 函数似乎无法识别句点:
s = 'crate.png'
i, j = string.find(s, '.')
print(i, j) --> 1 1

仅使用点:

s = 'crate.png'
i, j = string.find(s, 'p')
print(i, j) --> 7 7

那是一个bug,还是我做错了什么?


请参考如何在Lua中使用string.find查找方括号字符。虽然它涉及到不同的特殊字符,但解决方案是相同的。 - finnw
3个回答

24

string.find()默认情况下不会在字符串中找到字符串,而是会在字符串中找到patterns。更完整的信息可以在链接中找到,但这里是相关部分;

'.'代表通配符,可以代表任何字符

要查找实际的字符串.,需要用百分号转义该句点,%.

编辑:或者,您可以传递一些额外的参数,find(pattern, init, plain),允许您将true作为最后一个参数传入并搜索普通字符串。那样做会使您的语句变成;

> i, j = string.find(s, '.', 1, true)   -- plain search starting at character 1
> print(i, j) 
6 6

1
-1; Lua中用于转义的字符是%,而不是\。试图使用反斜杠可能会导致"无效的转义序列"错误。 - hugomg
@missingno 当然,你是正确的,我混淆了转义字符和转义序列以及模式。已经修正了答案。 - Joachim Isaksson

10

请使用string.find(s, '%.')string.find(s, '.', 1, true)中的任意一个。


5
其他答案已经解释了问题所在。为了完整起见,如果您只对文件的基本名称感兴趣,可以使用 string.match。例如:
string.match("crate.png", "(%w+)%.")  --> "crate"

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