我需要帮助Lua和正则表达式来解决以下问题。我有以下格式的许多字符串:
"|keynameN=value"
垂直条(|
)和“keyname”之间可能包含多个空格。此外,它可能在键名和等号(=
)之间包含多个空格。
"|house10=true"
"|car11 = house"
"| name = car"
"| wow15 = cat"
我需要使用string.gsub()
函数传递正则表达式,该正则表达式仅动态替换每个键的名称(house10
,car11
,name
,wow15
)与我拥有,保留其后缀数字,并且不更改字符串的格式(例如保留空格)。我已经尝试了很多组合但没有成功。
答案 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