Каков правильный шаблон LUA для цитируемого текста?
-
29-09-2019 - |
Вопрос
Я играл с этим в течение часа или буксировки и оказался в дорожном блоке с коммунальными предприятиями LUA. Я пытаюсь сопоставить все цитируемые текст в строке и заменить его, если это необходимо.
Образец, который я придумал до сих пор: (? [ " ']) (.-)%1
Это работает в некоторых случаях, но не все случаи:
Working: "This \"is a\" string of \"text to\" test with"
Not Working: "T\\\"his \"is\' a\" string\" of\' text\" to \"test\" wit\\\"h"
В примере не работающего, я бы хотел, чтобы это соответствовало (я сделал функцию, которая получает матчи, которые я желаю, я просто ищу шаблон для использования с GSUB и любопытно, может ли это сделать шаблон Lua):
string
a" string" of
is' a" string" of' text
test
his "is' a" string" of' text" to "test" wit
Вместо этого я буду продолжать использовать свою функцию, но мне любопытно, есть ли узор, который я мог бы/должен использовать, и я просто что -то упускаю с шаблонами.
(Несколько изменений B/C Я забыл о формировании StackOverflows) (еще одно редактирование, чтобы сделать пример без HTML, поскольку это привело к предположениям, что я пытался проанализировать HTML)
Решение
Попытка соответствовать сбежавшему, цитируемый текст с использованием регулярных выражений - это все равно, что попытка удалить ромашки (и только DAISES) из поля с использованием газонокосилки.
Я сделал функцию, которая получает матчи, которые я желаю
Это правильный ход.
Мне любопытно, может ли это сделать рисунок Lua
С практической точки зрения, Даже если шаблон может сделать это, вы не хотите. С теоретической точки зрения, вы пытаетесь найти двойную цитату, которой предшествует равномерное количество обратных сбоев. Это определенно регулярный язык, и регулярное выражение, которое вы хотите, было бы чем -то вроде следующего (Lua Citking Conventions)
[[[^\](\\)*"(.-[^\](\\)*)"]]
И цитируемая строка будет результатом № 2. Но узоры Луа нет полные регулярные выражения; в частности, вы не можете положить *
После скобок. Так Я предполагаю, что эта проблема не может быть решена с помощью шаблонов LUA, Но поскольку узоры LUA не являются стандартной вещью в теории автоматов, я не знаю ни о какой методе проверки, которую вы могли бы использовать, чтобы доказать это.
Другие советы
Проблема с сбежавшими цитатами заключается в том, что, в целом, если перед цитатой есть нечетное количество обратных сбоев, то она сбежалась, и если есть равномерное число, это не так. Я не верю, что сопоставление образцов LUA достаточно мощное, чтобы представлять это условие, поэтому, если вам нужно проанализировать текст, то вам следует искать другой путь. Возможно, вы сможете перевернуть через строку и проанализировать ее, или вы можете найти каждую цитату по очереди и читать назад, подсчитывая обратную черту, пока не найдете символ, не связанный с BackSlash (или начало строки).
Если вам абсолютно необходимо использовать шаблоны по какой-то причине, вы можете попробовать сделать это в многоэтапном процессе. Во -первых, GSUB для всех случаев двух обратных сборов подряд и замените их на какое -то значение. Этот должен быть значением, которое еще не встречается в строке. Вы можете попробовать что-то вроде « 001», если вы знаете, что эта строка не содержит неприятных символов. В любом случае, после того, как вы заменили все последовательности двух обратных сборов подряд, любая левая обратная черта избегает следующего символа. Теперь вы можете применить свой исходный шаблон, а затем, наконец, вы можете снова заменить все экземпляры вашего значения Sentinel снова двумя Backslash.
Язык с шаблоном Луа является достаточным для многих простых случаев. И у него есть по крайней мере один трюк, который вы не найдете в типичном пакете регулярного выражения: способ соответствовать сбалансированному скобкам. Но у него есть свои ограничения.
Когда эти пределы превышены, я достигаю LPEG. Отказ LPEG - это реализация Расположение выражения граммар Для Lua, и был реализован одним из оригинальных авторов Lua, чтобы адаптация к LUA сделана довольно хорошо. ПЭГ допускает спецификацию чего -либо от простых шаблонов с помощью полных языковых грамматик, чтобы быть написанным. LPEG собирает грамматику на байт -код и выполняет ее чрезвычайно эффективно.
вам следует НЕТ пытаться проанализировать HTML с регулярными выражениями, HTML и XML НЕТ обычные языки и не могут быть успешно манипулировать с помощью регулярных выражений. Вы должны использовать выделенный HTML -анализатор. Вот много объяснений, почему.