用正则表达式替换字符串

时间:2015-03-24 10:22:51

标签: regex string lua lua-patterns

我需要帮助Lua和正则表达式来解决以下问题。我有以下格式的许多字符串:

"|keynameN=value"

垂直条(|)和“keyname”之间可能包含多个空格。此外,它可能在键名和等号(=)之间包含多个空格。

  1. "|house10=true"
  2. "|car11 = house"
  3. "| name = car"
  4. "| wow15 = cat"
  5. 我需要使用string.gsub()函数传递正则表达式,该正则表达式仅动态替换每个键的名称(house10car11namewow15)与我拥有,保留其后缀数字,并且不更改字符串的格式(例如保留空格)。我已经尝试了很多组合但没有成功。

2 个答案:

答案 0 :(得分:2)

我说

new_string = string.gsub(old_string, "^(| *)[A-Za-z]+", "%1prefix", 1)

prefix中的"%1prefix"是要替换密钥的第一部分的内容。最后, 1并非绝对必要,因为^会将模式固定在行的开头,但可能会让gsub做更少的工作。

基本技巧是从输入字符串中捕获|和后续空格,并在替换中使用它们(使用%1)。

根据允许密钥的精确格式,可能需要调整[A-Za-z]个允许字符集(例如[A-Za-z_],如果密钥可以包含下划线)。撬棍的方法是使用[^0-9 =](即除了数字,空格和=之外的任何东西),但我不确定我是否会推荐它。

顺便说一句,请注意,Lua patterns不是正则表达式(并且功能稍弱)。

答案 1 :(得分:0)

一种可能的解决方案(参见下面示例中的函数'我的')

t = {
    {"|house10=true"          , 'residence'},
    {"|car11 = house"         , 'auto'},
    {"| name    = car"        , 'label'},
    {"|     wow15  =   cat"   , 'owo'},
}

function my(s,myown)
  s = s:gsub('(|%s*)(%a+)(%d*%s*=%s*%a+)','%1'..myown..'%3')
  return s
end

for _,v in ipairs(t) do
  print(my(v[1],v[2]))
end