Finding '.' with string.find()
Solution 1
string.find()
, by default, does not find strings in strings, it finds patterns in strings. More complete info can be found at the link, but here is the relevant part;
The '.' represents a wildcard character, which can represent any character.
To actually find the string .
, the period needs to be escaped with a percent sign, %.
EDIT: Alternately, you can pass in some extra arguments, find(pattern, init, plain)
which allows you to pass in true
as a last argument and search for plain strings. That would make your statement;
> i, j = string.find(s, '.', 1, true) -- plain search starting at character 1
> print(i, j)
6 6
Solution 2
Do either string.find(s, '%.')
or string.find(s, '.', 1, true)
Solution 3
The other answers have already explained what's wrong. For completeness, if you're only interested in the file's base name you can use string.match
. For example:
string.match("crate.png", "(%w+)%.") --> "crate"
Admin
Updated on July 09, 2022Comments
-
Admin almost 2 years
I'm trying to make a simple string manipulation: getting the a file's name, without the extension. Only,
string.find()
seem to have an issue with dots:s = 'crate.png' i, j = string.find(s, '.') print(i, j) --> 1 1
And only with dots:
s = 'crate.png' i, j = string.find(s, 'p') print(i, j) --> 7 7
Is that a bug, or am I doing something wrong?
-
Rohan Desai about 11 years-1; The escape character for Lua patterns is
%
, not\
. Trying to use a backslash will probably give you an "invalid escape sequence" error. -
Joachim Isaksson about 11 years@missingno You're of course correct, I mixed up the escape character for escape sequences and patterns. Fixed the answer.