我需要编写一个命令,在文件中搜索与某个正则表达式匹配的字符串,然后插入该字符串。我知道如何使用正则表达式解析文本字符串
\usepackage{l3regex}
\ExplSyntaxOn
\cs_new_protected:Npn \mycom #1
{
\tl_set:Nn \l_tmpa_tl {#1}
\regex_replace_all:nnN { THE-REGEXP } { THE-REPLACEMENT } \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
但我不知道如何使用它来解析文件的内容。我尝试用 替换{#1}
,{\input{#1}}
但没有成功(\input
仅被视为字符串的一部分)。
答案1
目前,还没有将文件内容存储到标记列表中的工具,但是您仍然可以使用该catchfile
包:
\documentclass{article}
\usepackage{catchfile}
\usepackage{expl3,l3regex}
\ExplSyntaxOn
\cs_new_protected:Npn \mycom #1
{
\CatchFileDef \l_tmpa_tl {#1} {}
\regex_replace_all:nnN { xrep } { foo } \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\mycom{xrep}
更新
在 2014-06-25 的修订版中,功能已添加到expl3
:
\documentclass{article}
\usepackage{expl3,l3regex,xparse}
\ExplSyntaxOn
\NewDocumentCommand{\mycom}{m}
{
\malabarba_mycom:n { #1 }
}
\tl_new:N \l_malabarba_mycom_content_tl
\cs_new_protected:Npn \malabarba_mycom:n #1
{
\tl_set_from_file:Nnn \l_malabarba_mycom_content_tl {} {#1}
\regex_replace_all:nnN { xrep } { foo } \l_malabarba_mycom_content_tl
\tl_use:N \l_malabarba_mycom_content_tl
}
\ExplSyntaxOff
\mycom{xrep}
\CatchFileDef
请注意,和之间存在差异\tl_set_from_file:Nnn
:在前一个命令中尾随参数包含在加载文件之前要(本地)执行的设置指令,在后者中,这些设置令牌应放在第二个参数中
\CatchFileDef<command name>{<filename>}{<setup>}
\tl_set_from_file:Nnn <tl variable> { <setup> } { <filename> }
的类似物\CatchFileEdef
称为
\tl_set_from_file_x:Nnn