Lua string.gsub() 按 '%s' 或 '\n' 模式

yft*_*ftx 3 lua pattern-matching lua-patterns

英语不是我的母语,所以描述这个问题有点困难。
我想通过 lua string.gsub() 在 str 中获取 'd=40',但是有一些问题。

------代码如下---
local str = [==[
-- a=10
- -b=20
--c=30
d=40
]==]

本地 pat1 = [=[%s[%s]]=]
本地 pat2 = [=[\n[%s]]=]
str:gsub(pat1, 函数 print("pat1>>" .. s ) end) --pat1>>d=40
str:gsub(pat2, 函数 print("pat2<<" .. s) end) --不匹配

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

正如Lua 5.1参考手册所说
%s: 代表所有空格字符。
我认为它等于'\n'、''和'\t'。

问题:为什么pat2无法匹配?
但我认为 pat2 是对的,有一个 '\n'befor'd=40' ,
所以我认为它可以匹配,但它不能工作,为什么?

Nic*_*las 5

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

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

字符串字面量[[\n]]正如它所说:字符“\”后跟字符“n”。因为没有进行转义,\n所以没有受到特殊对待。这正是它看起来的样子。

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