Каков правильный шаблон Lua для цитируемого текста? - PullRequest
5 голосов
/ 30 ноября 2010

Я играл с этим в течение часа или буксировки и оказался в блокпосте с утилитами сопоставления с образцом 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

Я собираюсь продолжать использовать мою функцию вместо этого, но покаЛюбопытно, есть ли шаблон, который я мог бы / должен использовать, и я просто что-то упускаю с шаблонами.

(несколько правок, я забыл о форматировании stackoverflows) (еще одна правка для создания не-htmlпример, поскольку это приводило к предположениям, что я пытался разобрать html)

Ответы [ 4 ]

5 голосов
/ 01 декабря 2010

Попытка сопоставить экранированный, заключенный в кавычки текст с использованием регулярных выражений аналогична попытке удалить ромашки (и только помосты) из поля с помощью газонокосилки.

Я создал функцию, которая получает соответствияЯ желаю

Это правильный ход.

Мне любопытно, может ли модель Луа сделать это

С практической точки зренияс точки зрения , даже если шаблон может сделать это, вы не хотите. С теоретической точки зрения вы пытаетесь найти двойную кавычку, которой предшествует четное число обратных слэшей.Это определенно регулярный язык, и нужное вам регулярное выражение будет выглядеть примерно следующим образом (соглашения о цитировании Lua)

[[[^\](\\)*"(.-[^\](\\)*)"]]

И строка в кавычках будет результатом # 2.Но шаблоны Lua - это , а не полные регулярные выражения;в частности, вы не можете поставить * после шаблона в скобках.Так что я предполагаю, что эту проблему невозможно решить с помощью шаблонов Lua, , но, поскольку шаблоны Lua не являются стандартным явлением в теории автоматов, я не знаю ни одного метода доказательства, который вы могли бы использовать для доказательстваэто.

2 голосов
/ 01 декабря 2010

Проблема с экранированными кавычками заключается в том, что, как правило, если перед кавычкой есть нечетное количество обратных слэшей, то она экранируется, а если есть четное число, это не так. Я не верю, что сопоставление с шаблоном Lua является достаточно мощным, чтобы представить это условие, поэтому, если вам нужно разобрать текст, подобный этому, вам следует искать другой путь. Возможно, вы можете перебрать строку и проанализировать ее, или вы можете найти каждую кавычку по очереди и прочитать назад, считая обратную косую черту, пока не найдете символ без обратной косой черты (или начало строки).

Если вам по какой-то причине необходимо использовать шаблоны, попробуйте сделать это в несколько этапов. Во-первых, gsub для всех вхождений двух обратных косых черт подряд и замените их каким-нибудь часовым значением. Это должно быть значением, которое еще не встречается в строке. Вы можете попробовать что-то вроде «\ 001», если знаете, что эта строка не содержит непечатаемых символов. В любом случае, после того, как вы заменили все последовательности двух обратных слешей подряд, все оставшиеся обратные слэши выходят за пределы следующего символа. Теперь вы можете применить свой исходный шаблон, и, наконец, вы можете снова заменить все экземпляры вашего значения часового на две обратные косые черты.

1 голос
/ 01 декабря 2010

Язык шаблонов Lua подходит для многих простых случаев.И у него есть по крайней мере одна хитрость, которую вы не найдете в типичном пакете регулярных выражений: способ сопоставить сбалансированные скобки.Но у него есть и свои пределы.

Когда эти пределы превышены, тогда я достигаю LPeg .LPeg является реализацией грамматического выражения синтаксического анализа для Lua, и был реализован одним из первоначальных авторов Lua, поэтому адаптация к Lua выполнена довольно хорошо.PEG позволяет задавать что угодно, от простых шаблонов до полных грамматик языка.LPeg компилирует грамматику в байт-код и выполняет ее чрезвычайно эффективно.

0 голосов
/ 30 ноября 2010

вы должны НЕ пытаться проанализировать HTML с регулярными выражениями, HTML и XML являются НЕ регулярными языками и не могут быть успешно обработаны с помощью регулярных выражений.Вы должны использовать специальный HTML-парсер. Вот много объяснений, почему .

...