Lua string.gsub() по шаблону '%s' или '\n'

Английский не является моим родным языком, поэтому немного сложно описать вопрос.
Я хочу получить 'd=40' в строке str с помощью lua string.gsub(), но есть проблема.

------код ниже---
local str = [==[
-- a=10
- -b=20
--c=30
d= 40
]==]

local pat1 = [=[%s[%s]]=]
local pat2 = [=[\n[%s]]=]
str:gsub(pat1, function(s) print("pat1 >>" .. s) end) --pat1>>d=40
str:gsub(pat2, function(s) print("pat2‹‹" .. s) end) --not match

local re1,_ = str:gsub("\n","$")
local re2,_ = str:gsub("%s","$")
print(re1) --a= 10$- -b=20$ --c=30$d=40$
print(re2) --$a=10$-$-b=20$$ --c=30$d=40$

В Справочном руководстве по Lua 5.1 скажем
%s: представляет все символы пробела.
Я думаю, что это равно '\n',' 'и'\t'.

Вопрос : Почему pat2 не может совпадать?
Но я думаю, что pat2 правильный, есть '\n'befor'd=40' ,
поэтому я думаю, что он может совпадать, но не работает, почему ?


person yftx    schedule 14.04.2012    source источник


Ответы (1)


Когда вы используете нотацию [[]] для строк, это специальный строковый литерал, который принимает строку точно так, как вы ее предоставляете. Экранирование символов не выполняется. Вы можете поместить некоторое количество символов = в скобки, чтобы упростить использование символов [ в строке.

Строковый литерал "\n" — это один символ, представляющий новую строку. Это из-за использования escape-символа \. Экранирующий символ, применяемый к символу 'n', означает "символ новой строки".

Строковый литерал [[\n]] — это именно то, что он говорит: символ «\», за которым следует символ «n». Поскольку экранирование не выполняется, \n не обрабатывается особым образом. Это именно то, на что это похоже.

Поэтому, когда вы говорите local pat2 = [=[\n[%s]]=], вы говорите, что «первым символом должен быть '\', за которым следует 'n', за которым следует пробел. Это не то, что вам нужно; вы хотите экранирование работать. Итак, вы должны использовать обычный строковый литерал: local pat2 = "\n[%s]".

person Nicol Bolas    schedule 14.04.2012