【问题标题】:replacing a value withgsub in lua在lua中用gsub替换一个值
【发布时间】:2014-04-12 11:19:30
【问题描述】:
function expandVars(tmpl,t)  
      return (tmpl:gsub('%$([%a ][%w ]+)', t)) end
 local sentence = expandVars("The $adj $char1 looks at you and says, $name, you are $result", {adj="glorious", name="Jayant", result="the Overlord", char1="King"}) 
   print(sentence)

上面的代码只有当我在变量名之后有','时才有效,在上面的句子中它适用于$ name和$ result,但不适用于$adj和$char1,这是为什么?

【问题讨论】:

  • 变量名中是否允许有空格?如果没有,请尝试%$(%a%w*)
  • 哦,是的!有效。但是, [%a][%w] 与 %a%w 有何不同?请问?
  • [%w ] 表示字母数字符号或空格

标签: lua gsub


【解决方案1】:

问题

您的模式[%a ][%w ]+ 表示一个字母或空格,后跟至少一个字母或数字或空格。由于正则表达式是贪婪的,它会尝试匹配尽可能大的序列,并且匹配将包含空格:

function expandVars(tmpl,t)  
    return string.gsub(tmpl, '%$([%a ][%w ]+)', t)
end

local sentence = expandVars(
    "$a1 $b and c $d e f ", 
    {["a1 "]="(match is 'a1 ')", ["b and c "]="(match is 'b and c ')", ["d e f "]="(match is 'd e f ')", }
) 

这会打印出来

(匹配是'a1')(匹配是'b and c')(匹配是'd e f')

解决方案

变量名称必须与表中的键匹配;你可以接受有空格和各种字符的键,但是你强迫用户在表键中使用[],如上所述,这不是很好:)

最好使用字母数字和下划线,但不能以数字开头。这意味着要通用,您需要一个字母(%a),后跟任意数量(包括无)(* 而不是+)的字母数字和下划线[%w_]

function expandVars(tmpl,t)  
    return string.gsub(tmpl, '%$(%a[%w_]*)', t)
end

local sentence = expandVars(
    "$a $b1 and c $d_2 e f ", 
    {a="(match is 'a')", b1="(match is 'b1')", d_2="(match is 'd_2')", }
) 

print(sentence)

这会打印出来

(match is 'a') (match is 'b1') and c (match is 'd_2') e f;不可匹配:$_a $1a b

它显示了如何不接受前导下划线和前导数字。

【讨论】:

  • @Simrankaur Np。既然您有要点,请不要忘记是否有用(不仅是对您的问题的回答,还有您认为有用的任何 SO 答案或您觉得棘手的问题)。
  • 我很想这样做,但我只能投票给 cmets,对吧?不是答案?让我知道是否可以
  • @Simrankaur 只需要 15 分即可为答案投票。在超过 300 次代表时,您最好开始! :) 您可以查看您发布的问题,然后返回为每个问题中最有用的答案投票。然后返回您提供的答案并投票赞成那些有用的问题(即,您因提出该问题而学到了一些东西——即使这在很大程度上是由于给出了答案)。欢迎来到 SO!
  • 谢谢,我只是从来没有注意到答案的投票符号,谢谢你让我知道。我会确保我这样做!
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
相关资源
最近更新 更多