2013-03-06 4 views
7

Я пытаюсь сделать простой манипуляции с строкой: получение имени файла без расширения. Только string.find(), кажется, есть проблема с точками:Поиск «.» with 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 

Это ошибка, или я делаю что-то не так?

+0

См [Как string.find квадратный символ крепежное Lua] (http://stackoverflow.com/questions/6077423/how-to-string-find-the-square-bracket- характер-в-Lua). Хотя это относится к другому специальному характеру, решение одно и то же. – finnw

ответ

14

string.find(), по умолчанию, не находит строки в строках, находит patterns в строках. Более полную информацию можно найти по ссылке, но вот соответствующая часть;

«.» представляет собой символ подстановки, который может представлять любой символ.

Чтобы действительно найти строку ., период должен быть экранирован со знаком процента, %.

EDIT: Кроме того, вы можете передать некоторые дополнительные аргументы, 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 [patterns] (http://www.lua.org/manual/5.2/manual.html#6.4.1) является '%', а не '\'. Попытка использовать обратную косую черту, вероятно, даст вам ошибку «неправильной escape-последовательности». – hugomg

+0

@ missingno Вы, конечно, правы, я перепутал escape-символ для escape-последовательностей и шаблонов. Исправлен ответ. –

+0

Ох. Благодарю. Это никогда не приходило мне в голову. :-) – user2141781

7

ли либо string.find(s, '%.') или string.find(s, '.', 1, true)

3

Другие ответы уже объяснили, что это не так. Для полноты, если вас интересует только базовое имя файла, вы можете использовать string.match. Например:

string.match("crate.png", "(%w+)%.") --> "crate" 
Смежные вопросы