string.find with new lines

时间:2011-06-27 10:47:33

标签: string lua

为什么string.find在这种情况下会返回nil?

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

我确定该字符串包含新的行序列 \ r \ n

我甚至尝试搜索 \ r \ n 以及\\r\\n

关闭模式匹配没有帮助

编辑:从文件中加载字符串str

3 个答案:

答案 0 :(得分:2)

  

一些包含多行的字符串

如果使用Lua的[[]]语法完成此操作,则生成的Lua字符串将不会包含\ r \ n,即使您将Lua文件另存为Dos文本也是如此。这符合Section 2.1 of the Lua Reference manual


所以你要从文件中加载字符串。 Lua使用C-standard io进行文件访问。您的io.open会或多或少地致电fopen。并且fopen默认执行文本转换,因此它会将\ r \ n转换为\ n。如果您不想这样,那么您需要将io.open的“模式”字符串后缀为“b”,如Section 5.7 of the Lua Reference manual中所述。

为什么你甚至想要搜索\ r \ n?为什么不直接搜索\ n?

答案 1 :(得分: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

答案 2 :(得分:0)

您使用的是什么操作系统,以及打开文件的模式(io.open的第二个参数)?如果您将其打开为文本('r''w'模式说明符而不是b - 如果未指定,io.open将使用'r'),Windows将转换所有从文件文件句柄读取'\ n'时'\r\n'个实例,因此您需要查找'\n'

如果您确实需要Windows保留'\r\n',则必须在打开文件时包含二进制说明符以禁止此转换:

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