Каков правильный шаблон LUA для цитируемого текста?

StackOverflow https://stackoverflow.com/questions/4317308

  •  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 -анализатор. Вот много объяснений, почему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top