2011-06-27 72 views
0

爲什麼string.find在這種情況下返回零?string.find換行

local str = -- some string with several lines 
local pos = string.find(str, "\r\n") 

我敢肯定,該字符串包含新行序列\ r \ n

我甚至嘗試尋找\ r\ n\\r\\n

關閉模式匹配沒有幫助

編輯:字符串str從文件加載。

+0

-1:不提供足夠的代碼重現該問題,並指示問題是用string.find而不是文件讀取。 – BMitch

+0

你到底在讀什麼文件?你在下面說過,你沒有使用io.open()。 –

+0

字節,以字節爲單位,因爲遊戲引擎不公開直接函數從遊戲數據文件中提取文件。所以,我必須親自動手。 – mnn

回答

1

你有多確定?

$ ./lua 
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio 
> str="hello\r\nworld" 
> pos = string.find(str, "\r\n") 
> print (pos) 
6 
+0

我不是說這不起作用。但是,我從文件加載字符串。 – mnn

+0

在這種情況下,您的問題應該是「爲什麼將文件加載到字符串中會更改行結束符?」並顯示你的代碼。 – BMitch

+0

它不會 - 我將字符串寫回臨時文件,並且行結束符\ r \ n在那裏。 – mnn

2

一些字符串,多行

如果這是使用Lua的[[]]語法完成,那麼生成的Lua字符串不會有\ r \ n在他們的,即使你保存的Lua文件作爲Dos文本。這符合Section 2.1 of the Lua Reference manual


所以你從文件中加載字符串。 Lua使用C標準io進行文件訪問。您的io.open或多或少會撥打fopen。並且fopen默認爲進行文本翻譯,所以它會將\ r \ n轉換爲\ n。如果你不想要這個,那麼你需要在Section 5.7 of the Lua Reference manual中說明的後綴io.open的「模式」字符串與「b」。

爲什麼你甚至想要搜索\ r \ n呢?爲什麼不只是搜索\ n?

+0

不,字符串實際上是從文件加載的。 – mnn

0

你在使用什麼操作系統,以及你打開文件的模式(第二個參數爲io.open)?如果你打開它作爲文本('r''w'模式說明符沒有b - 如果未指定,io.open將使用'r'),Windows將從文件文件句柄讀取時轉換所有'\r\n'實例爲'\ n',所以你想要尋找'\n'

如果你真的需要Windows來保存'\r\n',你必須包括二進制符當您打開文件,以抑制這種轉換:

local file = io.open('filename.txt','rb') --note the 'b' 
+0

首先,我沒有使用'io.open'來加載文件。其次,正如我所說的,我試圖尋找''n''但是沒有去。無論如何,我使用了一種解決方法,我正在尋找''\ r \ n''之前的最後一個字符 - 在我的情況下,它總是使用'\「' – mnn

+0

您使用的是什麼方法? – Robin

+0

嗯,代碼非常複雜。我使用遊戲引擎的服務從它的遊戲數據檔案中加載文件正如我已經說過的 - 我確定有'\ r \ n'字符,因爲我使用'io'模塊來打印調試日誌,並且該日誌_does_包含這些字符(在二進制級別檢查) – mnn