string.find с новыми строками - PullRequest
0 голосов
/ 27 июня 2011

Почему string.find возвращает ноль в этом случае?

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

Я уверен, что строка содержит новую последовательность строк \ r \ n .

Я даже пытался найти \ r , \ n , но также \\r\\n.

Отключение сопоставления с образцом не помогло

Редактировать: строка str загружается из файла.

Ответы [ 3 ]

2 голосов
/ 27 июня 2011

некоторая строка с несколькими строками

Если это сделано с использованием синтаксиса Lua [[]], полученная строка Lua не будет иметь \ r \ n в них, даже если вы сохранитеФайл Lua как текст Dos.Это соответствует Разделу 2.1 Справочного руководства Lua .


Итак, вы загружаете строку из файла.Lua использует C-стандарт io для доступа к файлам.Ваш io.open будет более или менее звонить fopenfopen по умолчанию выполняет перевод текста, поэтому он преобразует \ r \ n в \ n для вас.Если вы не хотите этого, вам нужно добавить суффикс io.open 'mode' строки к "b", как указано в Разделе 5.7 Справочного руководства Lua .

Почему вы вообще хотите искать \ r \ n?Почему бы просто не поискать \ n?

1 голос
/ 27 июня 2011

Насколько ты уверен?

$ ./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 голосов
/ 28 июня 2011

В какой ОС вы используете и в каком режиме вы открываете файл (второй параметр 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...