2

英语不是我的母语,所以很难描述这个问题。
我想通过 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) --不匹配

本地 re1,_ = str:gsub("\n","$")
本地 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' ,
所以我认为它可以匹配,但它不能工作,为什么?

4

1 回答 1

3

当您[[]]对字符串使用表示法时,这是一个特殊的字符串文字,它完全按照您提供的方式获取字符串。没有进行字符转义。您可以在括号中放置一些=字符,以便更容易让您在字符串中使用 [ 字符。

字符串文字"\n"是一个字符,代表换行符。那是因为使用了转义字符\。应用于“n”字符的转义字符表示“换行符”。

字符串文字[[\n]]正是它所说的:字符“\”后跟字符“n”。因为没有进行转义,\n所以没有特殊处理。这正是它的样子。

因此,当你说local pat2 = [=[\n[%s]]=]你说“第一个字符应该是 '\' 后跟 'n' 后跟一个空格。这不是你想要的;你想要转义工作。所以你应该使用常规字符串文字:local pat2 = "\n[%s]".

于 2012-04-14T18:44:27.730 回答