我想在 LaTeX 中做一些简单的模式匹配,其中模式中的字符(例如,shell 中的字符*
,或正则表达式中的字符.*
,我将使用后者)替换目标中的零个或多个字符。我强烈希望找到一种可以与 pdfLaTeX、XeLaTeX 和 luaLaTeX 无缝协作的解决方案。
给定一个列表列表和一个模式,例如:
\newcommand{\target}{{a,b,c},{a,x,y,c},{a,b,d}}
\newcommand{\pattern}{a,.*,c}
我想要一个命令
\matchpattern{\pattern}{\target}\result
这将设置为匹配的\result
元素,即\target
\pattern
{{a,b,c},{a,x,y,c}}
如果这可以使解决方案更简单/更容易,我也可以\result
只以第一个{a,b,c}
或最后{a,x,y,c}
一个匹配(而不是所有匹配)来结束。
我相信这两个包makematch
和l3regex
可能会有所帮助。但我无法makematch
从文档中了解如何使用,这l3regex
远远超出了我的向导水平。
欢迎任何帮助。谢谢。
答案1
语法是
\matchpattern[+][*]{<pattern>}{<target>}<result>
其中+
表示使用存储的模式和*
使用存储的目标。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\matchpattern}{t+ s m m m}
{
\IfBooleanTF{#1}
{% use stored pattern
\IfBooleanTF{#2}
{% expand the argument
\joao_matchpattern:nVNN #3 #4 #5 \regex_match:NnT
}
{% explicit argument
\joao_matchpattern:nnNN #3 { #4 } #5 \regex_match:NnT
}
}
{% use explicit pattern
\IfBooleanTF{#2}
{% expand the argument
\joao_matchpattern:nVNN { #3 } #4 #5 \regex_match:nnT
}
{
\joao_matchpattern:nnNN { #3 } { #4 } #5 \regex_match:nnT
}
}
}
\NewDocumentCommand{\definepattern}{mm}
{
\regex_set:Nn #1 { #2 }
}
\clist_new:N \l__joao_matchpattern_tmp_clist
\cs_new_protected:Nn \joao_matchpattern:nnNN
{% #4 is either \regex_match:NnT or \regex_match:nnT
% #1 is the pattern (either stored or explicit)
% #2 is the target (either stored or explicit)
% #3 is the macro to hold the result
\clist_clear:N \l__joao_matchpattern_tmp_clist
\clist_map_inline:nn { #2 }
{
#4 { #1 } { ##1 }
{
\clist_put_right:Nn \l__joao_matchpattern_tmp_clist { {##1} }
}
}
\clist_set_eq:NN #3 \l__joao_matchpattern_tmp_clist
}
\cs_generate_variant:Nn \joao_matchpattern:nnNN { nV }
\ExplSyntaxOff
\begin{document}
\matchpattern{a,.*,c}{{a,b,c},{a,x,y,c},{a,b,d}}\result
\show\result
\definepattern{\pattern}{a,.*,c}
\matchpattern+{\pattern}{{a,b,c},{a,x,y,c},{a,b,d}}\result
\show\result
\newcommand{\target}{{a,b,c},{a,x,y,c},{a,b,d}}
\matchpattern+*{\pattern}{\target}\result
\show\result
\stop
在这三种情况下,答案都是
> \result=macro:
->{a,b,c},{a,x,y,c}.