Я создаю одностраничное веб-приложение, которое дает результаты в реальном времени для lua -паттернов. Я использую vue magi c и 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(.)
, пробел и символ. Это бесполезно!
Однако мы знаем, что "%0"
в gsub представляет весь матч, а не разные группы. План: внутри каждого всего матча размечать индивидуализированные группы.
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
pattern: %s.
Результат: This%0s%0our%0andbox
Проблема: На ссылку %0
можно ссылаться, только если она непосредственно находится в возвращаемой строке. Также я не думаю, что это сработает, даже если бы я мог ссылаться на %0
.
Желаемый результат:
Для тестовой строки Quick Brown Fox
и шаблона %s(%u)
, производить Quick<mark> B</mark>rown<mark> F</mark>ox
Понятия не имею, что это за решение. Что бы вы порекомендовали?