Регулярное выражение для вставки строки с backsla sh и фигурными скобками в более фигурные скобки - PullRequest
2 голосов
/ 23 апреля 2020

Это кросс-пост от TeX , но он не получил никаких ответов. И поскольку я предполагаю, что проблема больше связана с моим пониманием регулярных выражений (или, лучше сказать, с их отсутствием), чем с самим LaTeX, StackOverflow, возможно, было бы лучшим местом для начала.

Я бы хотел использовать BibTool (который был написан в C, если это имеет какое-либо значение здесь), чтобы заключить некоторые строки в bib -файл в фигурные скобки. Запись теста bib выглядит следующим образом:

@Article{Cite1,
author       = {Adelbert, A.},
date         = {2020},
journaltitle = {A Journal},
title        = {A title with just \textit{Test} structure and some chemistry \ce{CO2}},
number       = {2},
pages        = {1--4},
volume       = {1},
}

Я создал следующий файл ресурсов BibTool:

resource {biblatex}
preserve.keys = on
preserve.key.case = on
rewrite.rule = {"\\\(.*{.*}\)" "{{\1}}"}

Предполагается, что rewrite.rule будет следующим:

  1. Найти все строки в любом поле, которые начинаются с \, например \ce{}, \textit{}, et c. Это делается с помощью \\ в начале регулярного выражения.
  2. Когда эта строка найдена, сохраните в группе следующее, обозначенное \(\): случайная строка в начале, за которой следует {, случайная строка, за которой следует }; то есть строка textit{Test}.
  3. Запишите эту строку обратно в ту же позицию, но заключите ее в двойной набор фигурных скобок "{{\1}}".

То, что она управляет так far:

  1. По-видимому, он находит все команды, начинающиеся с \.
  2. . Сохраняет строки и записывает их обратно в файл.

Итак далеко, код возвращает следующее

@Article{Cite1,
Author       = {Adelbert, A.},
Date         = {2020},
JournalTitle = {A Journal},
Title        = {A title with just {{textit{Test} structure and some chemistry {{ce{CO2}}}}}},
Number       = {2},
Pages        = {1--4},
Volume       = {1},
}

Вы видите, что он находит строки и ставит {{ в начале каждой строки. К сожалению, это ставит }} в конец поля, не строку, поэтому у меня теперь есть 6 фигурных скобок в конце поля заголовка. Скобки совпадают, только две из них должны быть после {{textit{Test}, а не в самом конце. Я пробовал различные конструкции, такие как rewrite.rule = {"\\\(.*{.*}\)$" "{{\1}}"}, rewrite.rule = {"\\\(.*{.*}\) ?$" "{{\1}}"}, rewrite.rule = {"\\\(.*{.*}\)*$" "{{\1}}"}, но все это не сработало.

При попытке вернуть \ в начало строки, используя rewrite.rule = {"\\\(.*{.*}\)" "{{\\\1}}"} I получайте обратно \, а также тысячи {}, пока не получите ошибку Rewrite limit exceeded.

Я не очень хорош с регулярными выражениями и буду рад любым комментариям.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Мой подход будет использовать две фазы. На первом этапе я обрабатываю макрос с одним аргументом и заменяю в результате \ заменяющим представлением (здесь ##). Во втором стихе я просто заменяю ## на \.

. В BibTool это выглядит следующим образом:

rewrite.rule {"\\\(\([a-zA-Z]+\|.\){[^{}]*}\)" "{##\1}"}
rewrite.rule {"##" "\\"} 

Обратите внимание, что в целом описанная задача не может быть решена с помощью регулярных выражений. ..

2 голосов
/ 23 апреля 2020

Поведение .* по умолчанию состоит в подборе максимально возможного количества символов. Это называется «жадным соответствием» в терминах регулярных выражений.

Вероятно, ваш шаблон соответствует следующему при попадании в первый \:

\textit{Test} structure and some chemistry \ce{CO2}}

Замена текста на:

{{textit{Test} structure and some chemistry \ce{CO2}}}}

А затем найти следующий \ и заменить:

\ce{CO2}}}} becomes {{ce{CO2}}}}}}

Общий эффект:

{A title with just \textit{Test} structure and some chemistry \ce{CO2}}

{A title with just {{textit{Test} structure and some chemistry {{ce{CO2}}}}}}

Чтобы изменить поведение в большинстве разновидностей регулярных выражений, вы можете поставить ? после квантификатора: .*?, чтобы сделать его «ленивым», то есть соответствовать наименьшему количеству символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...