Finding '.' with string.find()

user2141781 picture user2141781 · Mar 6, 2013 · Viewed 24.9k times · Source

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?

Answer

Joachim Isaksson picture Joachim Isaksson · Mar 6, 2013

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