如何使用 html 标签标记模式中的组,而不删除非组模式?

我正在构建一个单页 web 应用,实时提供 lua 模式的结果。 我使用 vue 魔法和 fengari js/lua 交互来自动在屏幕上运行一个函数,每次更新要匹配的文本或模式时。该函数的目标是突出匹配的文本。

这里的相关 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

我不知道解决方案是什么。你有什么建议吗?

点赞
用户7509065
用户7509065
将他们给你的整个模式都包在括号里,这样它就是第一组,无论其中包含多少个组:

string.gsub(text_to_test, "("..pattern..")", function(m) return ""..m.."" end)

```

2020-04-28 00:35:07