我正在显示源代码,我将路径传递给宏。现在我想知道是否可以使用xstring
或
stringstrings
匹配最后一个分隔符之后的内容,即/
到字符串末尾的内容来确定文件名。
示例:我可能会将../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}