2013-03-06 9 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

参照[LUAで角括弧文字をのstring.Find方法](http://stackoverflow.com/questions/6077423/how-to-string-find-the-square-bracket-ルア文字)。異なる特殊文字を指していますが、解決方法は同じです。 – 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)のエスケープ文字は '\'ではなく '%'です。バックスラッシュを使用しようとすると、おそらく "無効なエスケープシーケンス"エラーが発生します。 – hugomg

+0

@missingnoあなたはもちろん正しいです、私はエスケープシーケンスとパターンのエスケープ文字を混ぜました。答えを修正しました。 –

+0

ああ。ありがとう。それは私の心を越えたことはありません。 :-) – user2141781

7

くださいstring.find(s, '%.')またはstring.find(s, '.', 1, true)

3

他の回答のいずれかが既に間違っているものを説明しました。完全性のために、ファイルのベース名にのみ興味がある場合は、string.matchを使用できます。たとえば、次のように

string.match("crate.png", "(%w+)%.") --> "crate" 
関連する問題