我在使用 替换字符串时遇到了问题\StrSubstitute
。我理解函数的方式是,根据文档(第 7/8 页),它应该使用三个参数。它应该在文本中搜索第一个参数,然后用第三个参数替换第一个参数中的第二个参数。
\documentclass[12pt]{scrartcl}
\usepackage{xstring}
\begin{document}
\StrSubstitute{abcde}{d}{D}
blablabla
abcde
\input{mwe2}
cdeba
\end{document}
输入文件mwe2.tex
只是
abcde
abcde
12345
然而,在PDF文件中的结果只是:
ABCDE
啦啦啦
ABCDE
ABCDE
ABCDE
12345
基德巴
即软件将字符串abcde
放在命令的位置\StrSubstitute
,然后d
用此处替换,但忽略文档中其他任何地方的D
字符串。abcde
有人能帮忙吗?祝好,玛丽
答案1
\StrSubstitute
仅对第一个参数内容起作用,即它是一次性替换。除非源字符串出现在第一个参数中,否则将忽略后续出现的源字符串。\StrSubstitute
如果源字符串包含在宏中,例如,则的可用性会得到改善\newcommand{\foo}{abcde}
。
但\StrSubstitute{\input{mwe2}{...}{...}
由于扩展问题,无法工作。
我尝试使用该l3regex
包(第一次),对于简单的正则表达式来说它相当容易(abcde
很简单 ;-)
该\SearchAndReplace
宏打开文件mwe2.tex
并用 替换出现的abcde
(但是,如果de`abcDe
之间有换行符,我认为它不起作用) 。abc and
\documentclass[12pt]{scrartcl}
\usepackage{xstring}
\usepackage{xparse}
\usepackage{l3regex}
\ExplSyntaxOn
\ior_new:N \l_marie_input_stream
\NewDocumentCommand{\SearchAndReplace}{mmm}{%
\ior_open:Nn \l_marie_input_stream {#1}% Open the file
\ior_map_inline:Nn \l_marie_input_stream {% Read line by line
\tl_set:Nn \l_tmpa_tl {##1}% Store the line
\regex_replace_all:nnN {#2} {#3} \l_tmpa_tl % Replace #2 by #3
\tl_use:N \l_tmpa_tl % Display the (modified) line content
}
\ior_close:N \l_marie_input_stream % close the file
}
\ExplSyntaxOff
\begin{document}
With \verb!\StrSubstitute!
\StrSubstitute{abcde}{d}{D}
blablabla
abcde
Now with \verb!\SearchAndReplace!
\SearchAndReplace{mew2.tex}{abcde}{abcDe}
cdeba
\end{document}
这是mew2.tex
abcde abcde
abcde
12345
输出结果如下: