这是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
应该是以下内容:
\
开头的任何字段中的所有字符串,例如\ce{}
,\textit{}
等。这由正则表达式开头的\\
完成。\(\)
表示:开头是随机字符串,然后是{
,是随机字符串,然后是}
;即字符串textit{Test}
。"{{\1}}"
中。到目前为止管理的内容:
\
开头的命令。到目前为止,代码返回以下内容
@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
错误。
我对正则表达式不太满意,并希望收到任何评论。
.*
的行为默认是匹配尽可能多的字符。这在正则表达式中称为“贪婪匹配”。
您的模式在击中第一个\
时可能符合以下条件:
\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}}}}}}
要更改大多数正则表达式样式的行为,您可以在量词后加上?
:*?
以使其与“懒惰”匹配,即与最少字符匹配。