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

时间:2012-04-14 18:32:54

标签: lua pattern-matching lua-patterns

英语不是我的母语,所以描述这个问题有点难 我想通过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',
所以我认为它可以匹配,但它不能工作,为什么?

1 个答案:

答案 0 :(得分:3)

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

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

字符串文字[[\n]]正是它所说的:字符'\'后跟字符'n'。由于没有进行转义,因此\n不会被特别处理。这正是它的样子。

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