14

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?

1

3 Answers 3

29

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
Sign up to request clarification or add additional context in comments.

2 Comments

-1; The escape character for Lua patterns is %, not \ . Trying to use a backslash will probably give you an "invalid escape sequence" error.
@missingno You're of course correct, I mixed up the escape character for escape sequences and patterns. Fixed the answer.
9

Do either string.find(s, '%.') or string.find(s, '.', 1, true)

Comments

5

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"

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.