英语不是我的母语,所以描述这个问题有点难
我想通过lua string.gsub()在str中得到'd = 40',但是有一些问题。
------下面的代码---
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
本地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',
所以我认为它可以匹配,但它不能工作,为什么?
答案 0 :(得分:3)
当您对字符串使用[[]]
表示法时,这是一个特殊的字符串文字,它完全按照您提供的字符串获取字符串。没有人物逃脱。您可以在括号中放置一些=
个字符,以便让您更容易使用[字符串中的字符。
字符串文字"\n"
是一个字符,代表换行符。这是因为使用了转义字符\
。应用于'n'字符的转义字符表示“换行符”。
字符串文字[[\n]]
正是它所说的:字符'\'后跟字符'n'。由于没有进行转义,因此\n
不会被特别处理。这正是它的样子。
因此,当你说local pat2 = [=[\n[%s]]=]
你说“第一个字符应该是'\'后跟'n'后跟一个空格。这不是你想要的;你想要逃避工作。所以你应该使用常规字符串文字:local pat2 = "\n[%s]"
。