正则表达式将带有反斜杠和大括号的字符串嵌入到更多的大括号中

问题描述 投票:2回答:1

这是cross-post from 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{}等。这由正则表达式开头的\\完成。
  2. 找到此字符串后,将以下内容保存在一个组中,用\(\)表示:开头是随机字符串,然后是{,是随机字符串,然后是};即字符串textit{Test}
  3. 将该字符串写回到相同的位置,但将其括在双花括号"{{\1}}"中。

到目前为止管理的内容:

  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},
}

您会看到它找到了字符串,并将{{放在每个字符串的开头。不幸的是,它把}}放在字段的末尾,not字符串,所以我现在在标题字段的末尾有6个花括号。花括号确实匹配,其中只有两个应该在{{textit{Test}之后,而不是在最后。我尝试了rewrite.rule = {"\\\(.*{.*}\)$" "{{\1}}"}rewrite.rule = {"\\\(.*{.*}\) ?$" "{{\1}}"}rewrite.rule = {"\\\(.*{.*}\)*$" "{{\1}}"}之类的各种构造,但这都没有用。

[当尝试使用字符串\取回字符串开头的rewrite.rule = {"\\\(.*{.*}\)" "{{\\\1}}"}时,我取回了\,但也取回了数千个{},直到出现Rewrite limit exceeded错误。

我对正则表达式不太满意,并希望收到任何评论。

regex latex regular-language
1个回答
1
投票

.*的行为默认是匹配尽可能多的字符。这在正则表达式中称为“贪婪匹配”。

您的模式在击中第一个\时可能符合以下条件:

\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}}}}}}

要更改大多数正则表达式样式的行为,您可以在量词后加上?*?以使其与“懒惰”匹配,即与最少字符匹配。

© www.soinside.com 2019 - 2024. All rights reserved.