我正在构建一个单页面的webapp,它可以提供lua模式的实时结果。每当您要匹配的文本或某个模式被更新时,我都会使用vue magic和fengari js / lua interop自动在屏幕上运行一个功能。该功能的目的是突出显示匹配的文本。
这里相关的lua代码是函数,我想到的第一件事就是gsub。string.gsub(text_to_test, pattern, function(m) return "<mark>"..m.."</mark>" end)
这非常适用-适用于没有分组的模式。如:%u%l
测试字符串:This is your sandbox
模式:%s.
结果:This<mark> i</mark>s<mark> y</mark>our<mark> s</mark>andbox
但是,如果有人想要测试一组模式,例如:%s(.)
(或更糟糕的是:多个组!),该怎么办?相同的测试字符串,模式现在为:%s(.)
结果: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)
测试字符串:This is your sandbox
模式:%s.
结果:This%0s%0our%0andbox
问题:%0
仅在直接在返回字符串中时才能被引用。另外,即使我可以引用%0
,我也不认为这会起作用。
期望的结果:对于测试字符串Quick Brown Fox
和模式%s(%u)
产生Quick<mark> B</mark>rown<mark> F</mark>ox
我不知道解决方案是什么。您会推荐什么?
我正在构建一个单页面的webapp,它可以提供lua模式的实时结果。每当您输入文字时,我都会使用vue magic和fengari js / lua interop在屏幕上自动运行一个功能...
将它们给您的整个模式都用括号括起来,所以不管是哪个组,它都是第一组: