为什么string.find
在这种情况下会返回nil?
local str = -- some string with several lines
local pos = string.find(str, "\r\n")
我确定该字符串包含新的行序列 \ r \ n 。
我甚至尝试搜索 \ r , \ n 以及\\r\\n
。
关闭模式匹配没有帮助
编辑:从文件中加载字符串str
。
答案 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'