2013-03-06 29 views
7

Tôi đang cố gắng thực hiện thao tác chuỗi đơn giản: lấy tên của tệp, không có phần mở rộng. Chỉ, string.find() dường như có một vấn đề với dấu chấm:Tìm '.' với string.find()

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

Và chỉ với dấu chấm:

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

Có phải đó là một lỗi, hoặc tôi đang làm điều gì sai?

+0

Xem [Cách chuỗi.find ký tự ngoặc vuông trong lua] (http://stackoverflow.com/questions/6077423/how-to-string-find-the-square-bracket- character-in-lua). Mặc dù nó đề cập đến một nhân vật đặc biệt khác, giải pháp là như nhau. – finnw

Trả lời

14

string.find(), theo mặc định, không tìm thấy chuỗi trong chuỗi, nó tìm thấy patterns trong chuỗi. Thông tin đầy đủ hơn có thể được tìm thấy tại liên kết, nhưng đây là phần liên quan;

'.' đại diện cho một ký tự đại diện, có thể đại diện cho bất kỳ ký tự nào.

Để thực sự tìm ra chuỗi ., giai đoạn này cần phải được chạy thoát với một dấu phần trăm, %.

EDIT: Cách khác, bạn có thể vượt qua trong một số lập luận thêm, find(pattern, init, plain) cho phép bạn vượt qua trong true như một đối số cuối cùng và tìm kiếm các chuỗi đơn giản. Điều đó sẽ làm cho tuyên bố của bạn;

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

-1; Ký tự thoát cho Lua [patterns] (http://www.lua.org/manual/5.2/manual.html#6.4.1) là '%', không phải '\'. Cố gắng sử dụng dấu gạch chéo ngược có thể sẽ cung cấp cho bạn lỗi "chuỗi thoát không hợp lệ". – hugomg

+0

@missingno Bạn hoàn toàn đúng, tôi trộn lẫn ký tự thoát cho các chuỗi và mẫu thoát. Đã sửa câu trả lời. –

+0

Ồ. Cảm ơn. Nó không bao giờ vượt qua tâm trí của tôi. :-) – user2141781

7

Thực hiện một string.find(s, '%.') hoặc string.find(s, '.', 1, true)

3

Những câu trả lời khác đã giải thích những gì là sai. Để hoàn thành, nếu bạn chỉ quan tâm đến tên cơ sở của tệp, bạn có thể sử dụng string.match. Ví dụ:

string.match("crate.png", "(%w+)%.") --> "crate"