我正在构建一个单页lua应用程序,为lua-patterns提供实时结果。我使用vue magic和fengari js/lua interop在每次匹配文本或模式更新时自动在屏幕上运行函数。该函数的目标是突出显示匹配的文本。
这里相关的lua代码是函数,我首先想到的就是gsub。
string.gsub(text_to_test, pattern, function(m) return "<mark>"..m.."</mark>" end)
对于没有分组的模式,这是非常有效的。例如:%u%l
测试字符串:结果模式:%s. This is your sandbox:This<mark> i</mark>s<mark> y</mark>our<mark> s</mark>andbox
但是,如果有人想要用一个组来测试一个模式,比如:%s(.) (或者更糟:多个组!)
相同的测试字符串,模式现在是:%s(.) Result:This<mark>i</mark>s<mark>y</mark>our<mark>s</mark>andbox
按照函数的工作方式,组中的字符作为m传递,返回的字符串替换整个模式%s(.)、空格和字符。这可不好!
然而,我们知道gsub中的"%0"代表整个比赛,而不是不同的组-计划:在每一场完整的比赛中,标记个性化的组。
string.gsub(s, p, function(m) local w = "%0" return string.gsub(w, m, function(a) return "<mark>"..a.."</mark>" end) end)
测试字符串:结果模式:%s. This is your sandbox:This%0s%0our%0andbox
问题:仅当直接在返回字符串中引用%0时才能引用。此外,我认为即使我可以引用%0,这也不会起作用。
期望的结果:
对于测试字符串Quick Brown Fox和模式%s(%u)
生成Quick<mark> B</mark>rown<mark> F</mark>ox
我不知道解决方案是什么。你有什么推荐的?
发布于 2020-04-28 08:35:07
将他们给你的整个模式放在括号中,所以它是第一组,无论它是什么组:
string.gsub(text_to_test, "("..pattern..")", function(m) return "<mark>"..m.."</mark>" end)https://stackoverflow.com/questions/61470535
复制相似问题