使用 LaTeX 进行简单的正则表达式匹配

使用 LaTeX 进行简单的正则表达式匹配

我想在 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}一个匹配(而不是所有匹配)来结束。

我相信这两个包makematchl3regex可能会有所帮助。但我无法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}.

相关内容