如何在lua中“一次性”替换字符串中的部分字符串?

时间:2016-11-22 15:43:22

标签: regex string lua

我有以下字符串的锚(我想要更改href的内容)和一个替换的lua表,它告诉应该替换哪个单词:

s1 = '<a href="word1"></a><a href="word2"></a><a href="word3"></a><a href="word1"></a><a href="word5"></a><a href="word2"></a><a href="word3"><a href="word7"></a>'

replacementTable = {}
replacementTable["word1"] = "potato1"
replacementTable["word2"] = "potato2"
replacementTable["word3"] = "potato3"
replacementTable["word4"] = "potato4"
replacementTable["word5"] = "potato5"

预期结果应为:

<a href="potato1"></a><a href="potato2"></a><a href="potato3"></a><a href="potato1"></a><a href="potato5"></a><a href="potato2"></a><a href="potato3"><a href="word7"></a>

我知道我可以为 replacementTable 中的每个元素进行迭代并每次处理字符串,但我的直觉告诉我,如果字符串非常大和/或替换表变得很大,这个apporach将表现不佳。

所以我觉得最好能做到以下几点:应用正则表达式查找所有匹配项,获取每个匹配项的迭代器,并在replacementTable中替换每个匹配项的值。

像这样的东西会很棒(用Javascript编写,因为我还不知道如何在Lua中编写lambdas):

var newString = patternReplacement(s1, '<a[^>]* href="([^"]*)"', function(match) { return replacementTable[match] })

第一个参数是字符串,第二个参数是正则表达式,第三个参数是为每个匹配项执行的替换函数。这样我认为s1会被解析一次,效率更高。

在Lua有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

在您的示例中,这个简单的代码有效:

print((s1:gsub("%w+",replacementTable)))

关键是gsub已经接受了替换表。

答案 1 :(得分:0)

最后,对我有用的解决方案如下:

   local updatedBody = string.gsub(body, '(<a[^>]* href=")(/[^"%?]*)([^"]*")', function(leftSide, url, rightSide)
            local replacedUrl = url
            if (urlsToReplace[url]) then replacedUrl = urlsToReplace[url] end
            return leftSide .. replacedUrl .. rightSide
        end)

它保留了任何querystring参数,只给我一个URI。我知道用正则表达式解析HTML主体是个坏主意但是对于我的情况,我需要很多性能,这样做的速度要快得多,而且只是完成了工作。