如何匹配最后一个子字符串

如何匹配最后一个子字符串

我正在显示源代码,我将路径传递给宏。现在我想知道是否可以使用xstringstringstrings匹配最后一个分隔符之后的内容,即/到字符串末尾的内容来确定文件名。

示例:我可能会将../code/subfolder/project/code.java要提取子字符串的宏传递给它code.java。匹配字符的第一次出现似乎很容易,但匹配最后一次出现却不容易。

答案1

不需要任何包,您可以使用 LaTeX 的文件名解析器:

\documentclass{article}

\begin{document}

\makeatletter

\filename@parse{../code/subfolder/project/code.java}

[\filename@area]

[\filename@base]

[\filename@ext]

\end{document}

答案2

这是一个使用 xstring 的方法:

\documentclass{article}
\usepackage{xstring}
\newcommand*\filename[1]{%
    \IfSubStr{#1}/
        {\StrCount{#1}/[\ossepoccur]%
        \StrBehind[\ossepoccur]{#1}/\relax
        }
        {#1}%
}
\begin{document}
\filename{abc.foo}

\filename{../code/subfolder/project/code.java}
\end{document}

答案3

这是分隔字符串中最后一项的通用提取器:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\extractlast}{O{/}mo}
 {
  \seq_set_split:Nnn \l_stroobants_string_seq { #1 } { #2 }
  \IfNoValueTF { #3 }
   {
    \seq_item:Nn \l_stroobants_string_seq { -1 }
   }
   {
    \tl_set:Nx #3 { \seq_item:Nn \l_stroobants_string_seq { -1 } }
   }
 }
\seq_new:N \l_stroobants_string_seq
\ExplSyntaxOff

\begin{document}

\extractlast{../code/subfolder/project/code.java}

\extractlast[-]{a-b-c-def}[\test]

\texttt{\meaning\test}

\end{document}

第一个可选参数是分隔符,默认为/;尾随的可选参数是一个宏名,其中存储最后一项,如果不存在,则打印该项。

在此处输入图片描述

完全可扩展的版本,但具有固定的分隔符;最好不要输入空字符串,尽管可以轻松添加对此的测试。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\extractlast}{m}
 {
  \stroobants_extractlast:nn #1 / \q_nil / \q_nil /
 }
\cs_new:Npn \stroobants_extractlast:nn #1 / #2 / \q_nil /
 {
  \str_if_eq:nnTF { #2 } { \q_nil }
   {% end of recursion
    #1
   }
   {% go on
    \stroobants_extractlast:nn #2 / \q_nil /
   }
 }
\ExplSyntaxOff

\begin{document}
\extractlast{../code/subfolder/project/code.java}

\edef\test{\extractlast{../code/subfolder/project/code.java}}
\texttt{\meaning\test}
\end{document}

在此处输入图片描述

答案4

这是一种方法stringstrings

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{stringstrings}
\def\fname#1{%
  \findchars[q]{#1}{/}%
  \edef\tmp{\theresult}%
  \convertchar[e]{x#1}{/}{ }%
  \getaword[q]{\thestring\ }{\numexpr\tmp+1\relax}%
  \edef\thefname{\thestring}%
}
\begin{document}
\fname{../code/subfolder/project/code.java}
The file is \thefname.
\end{document}

在此处输入图片描述

相关内容