如何获取字符串中的第 n 次出现?

如何获取字符串中的第 n 次出现?

我从外部程序获取一个字符串,并且我想获取该字符串的每个部分:

\documentclass{article}
\usepackage{bashful}

\begin{document}

% Test.sh would do echo "4 8 15 16 23 42"
\let\data{\splice{./test.sh}}

\begin{itemize}
    \item \getOccurences{2}{\data} %15
    \item \getOccurences{5}{\data} %23
\end{itemize}

\end{document}

读取的信息stdout是一系列用空格分隔的数字。

我该如何实现这个\getOccurences宏呢?

答案1

xstring包中有一个宏StrBetween[n,m]{full string}{string A}{string B}可能对此有所帮助。它将选择字符串 A 第 n 次出现和字符串 B 第 m 次出现之间的子字符串。在这种情况下,您可以将字符串 A 和字符串 B 都设置为空格,并提取第 2 个和第 3 个空格之间的字符串以获得 15,提取第 4 个和第 5 个空格之间的字符串以获得 23。

问题的第二部分是将外部输出转换为xstring可以处理的格式。这有点棘手。\splice在后台做了很多事情,这在扩展用于字符串处理的宏时会造成麻烦。更好的替代方法是使用\bashStdout定义的,bashful将最后一个块的输出捕获\bash \END为纯字符串。这里唯一的问题是空格有类别代码 12,这也会造成混淆xstring。作为解决方案,您可以使用“展平”字符串\detokenize。这还有一个额外的好处,您可以使用\edef扩展参数,允许在执行和实际使用值之间使用其他\bash \END块(将覆盖)。\bashStdout

梅威瑟:

\documentclass{article}
\usepackage{bashful}
\usepackage{xstring}

\begin{document}

\bash
echo "4 8 15 16 23 42"
\END
\edef\data{\detokenize\expandafter{\bashStdout}}
All data: \data

\begin{itemize}
    \item \StrBetween[2,3]{\data}{ }{ } %15
    \item \StrBetween[4,5]{\data}{ }{ } %23
\end{itemize}
\end{document}

结果:

在此处输入图片描述

答案2

此答案介绍了输入字符串后如何解析该字符串。因此,对于此示例,我仅使用 定义字符串\def。我使用listofitems包创建单个字符串元素的数组。

\documentclass{article}
%\usepackage{bashful}
\usepackage{listofitems}
\setsepchar{ }
\ignoreemptyitems
\begin{document}

% Test.sh would do echo "4 8 15 16 23 42"
%\let\data{\splice{./test.sh}}
\def\data{4 8 15 16 23 42}

\readlist\mylist{\data}

\mylist[3] should be 15

\mylist[5] should be 23

\end{document}

在此处输入图片描述

相关内容