Lua - Намиране на етикети в низ?

Планирам да използвам Lua шаблони, освен ако няма по-добър начин да направя това.

Искам да мога да анализирам низ и да търся "тагове". Например, бих искал да намеря частта '[color=???][/color]' от низ, без да ме интересува какво идва след равенствата, без да ме интересува какво има между маркерите и без да ме интересува къде са в низ, стига да са някъде в низа и че 'color=' има шестнадесетична стойност след него. Ето примерен низ:

mystring = 'Hello, [color=#0026FF]world[/color]!'
--                 ^^^^^^^^^^^^^^^     ^^^^^^^^

person Eamonn    schedule 10.08.2014    source източник
comment
Разбор на езици за маркиране с общо предназначение, които позволяват влагане < b>не е възможно да се използват регулярни изрази. - Това изглежда като онзи прочут език за маркиране на стилове във форума, на който не си спомням името -- има ли шанс някой вече да е написал подходящ анализатор за него?   -  person The Paramagnetic Croissant    schedule 10.08.2014
comment
Виждал съм го на phpBB и мисля, че се нарича phpBB Code Markup. Не съм сигурен дали има име. Не мисля, че все още някой е написал анализатор. По дяволите! Някакъв друг начин мога да търся тези тагове в Lua?   -  person Eamonn    schedule 10.08.2014
comment
Колко сложно е вашето маркиране? Какви са точните правила? Какво искате да направите, когато ги намерите? Модели в ръководството   -  person Deduplicator    schedule 10.08.2014
comment
Моля, имайте предвид, че моделите на Lua не са регулярни изрази; те имат различен синтаксис и моделите са по-слаби от регулярните изрази.   -  person Colonel Thirty Two    schedule 10.08.2014
comment
@paramagnetic: phpBB е силно идиосинкратичен. Не бих се изненадал, че действителният анализатор във форумните машини беше голямата бъркотия от регулярни изрази, които се опитвате да избегнете :)   -  person hugomg    schedule 10.08.2014
comment
Искате ли да анализирате всеки bbCode?   -  person Deduplicator    schedule 10.08.2014
comment
@Eamonn Как, за бога, стигна до това заключение? Намерих поне 3 отделни lua парсера за bbCode в рамките на 5 минути гугъл. Не че липсата на такъв би била голям проблем така или иначе, анализирането на bbCode е невероятно лесно. Ако приемем, че сте влезли без да знаете нищо за анализаторите, това все още не би трябвало да отнеме повече от няколко часа.   -  person Cubic    schedule 11.08.2014


Отговори (1)


Модели в ръководството

Първа стъпка, разделете токените:

function split_tag(s, i)
  i = (i or 0) + 1
  local j = s:sub(i, i)
  if j == "" then
    return
  end
  j = s:find(j == "[" and "]" or ".%f[[\0]", i) or #s
  -- In Pre-5.2 Lua use %z instead of \0 in the pattern
  return j + 1, s:sub(i, j)
end
for k, v in split_tags, 'Hello, [color=#0026FF][bold]world[/bold][/color]!' do
  print(('%q\n'):format(v))
end

По този начин получавате своя входен низ

'Hello, [color=#0026FF][bold]world[/bold][/color]!'

разделят се на

"Hello, "
"[color=#0026FF]"
"[bold]"
"world"
"[/bold]"
"[/color]"
"!"

Стандартен алгоритъм за съпоставяне на скоби, оставен като упражнение за читателя.

person Deduplicator    schedule 10.08.2014
comment
Получавам грешка, която гласи, че моделът е неправилно образуван (липсва ']') - person Eamonn; 10.08.2014
comment
Но i е тип номер - person hjpotter92; 10.08.2014
comment
@Deduplicator, използвам Lua версия 5.1 - person Eamonn; 10.08.2014
comment
@hjpotter92: По дяволите, твърде много рефакторинг без тестване. - person Deduplicator; 10.08.2014
comment
Работи! Постоянно получавам q, така че не съм сигурен какво прави :format(v) с кода... - person Eamonn; 10.08.2014