Разбор записи BibTeX с помощью Java RegEx - PullRequest
0 голосов
/ 26 ноября 2018

Я должен написать простой парсер BibTeX, используя регулярные выражения Java.Задача немного упрощена: каждое значение тега находится в кавычках "", а не в скобках {}.Дело в том, что {} может быть внутри "".

Я пытаюсь вырезать отдельные записи из всего файла String, например, я хочу получить @book{...} как String.Проблема в том, что после последнего тега не может быть запятой, поэтому она может заканчиваться следующим образом: author = "john"}.

Я пробовал @\w*\{[\s\S]*?\}, но останавливается, если у меня есть } в любом значении тегамежду "".Также нет гарантии, что } будет находиться в отдельной строке, это может быть непосредственно после последнего значения тега (которое также не может заканчиваться на ", так как это может быть целое число).

Можете ли выпомочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

В качестве основы можно попробовать следующее выражение: @\w+\{(?>\s*\w+\s*=\s*"[^"]*")*\}

Объяснение:

  • @\w+\{...\} будет записью, например, @book{...}
  • (?>...)* означает группу без захвата, которая может встречаться несколько раз или не появляться вообще - это означает, что она представляет теги
  • \s*\w+\s*=\s*"[^"]*" означает тег, которому может предшествовать пробел (\s*).Значение тега должно быть в двойных кавычках, и все, что находится между двойными кавычками, будет использовано, даже фигурные скобки.

Обратите внимание, что может быть еще несколько случаев, которые необходимо учитывать, но это должно быть в состоянии обработатьфигурные скобки в значениях тегов, потому что он будет «потреблять» каждый контент между двойными кавычками, поэтому он не будет совпадать, если бы отсутствовала закрывающая фигурная скобка (например, она соответствовала бы @book{ title="the use of { and }" author="John {curly} Johnson"}, но не @book{ title="the use of { and }" author="John {curly} Johnson").

0 голосов
/ 26 ноября 2018

Я нашел хак, он может помочь кому-то с такой же проблемой: после знака} должен стоять символ новой строки.Если end of value is only "(} знак не заканчивает любое значение), то [\ r \ n] в конце регулярного выражения будет достаточно.

...