LaTeX 计算字符串中某个字符出现的次数

LaTeX 计算字符串中某个字符出现的次数

假设我有一些字符串This~is a ~test。我需要计算字符数~。在 LaTeX 中有什么方法可以做到这一点吗?

答案1

使用expl3你可以分割代币列表进入项目然后计算项目(减1):


\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
% \CountSubStr{<substring>}{<string>}
\NewDocumentCommand{\CountSubStr}{ m m }{
  \seq_set_split:Nnn \l_tmpa_seq { #1 } { #2 }
  \int_eval:n {(\seq_count:N \l_tmpa_seq) - 1 }
}
\ExplSyntaxOff

\begin{document}

\CountSubStr{~}{This~is a ~test}% 2

\CountSubStr{yes}{a yes b yes c yes deyesfg yehs ij}% 4

\end{document}

答案2

为了更好地衡量,基于 LuaLaTeX 的解决方案:

在此处输入图片描述

\documentclass{article}
\usepackage{luacode} % for '\luastring' and '\luaexec' macros
\newcommand\tildecount[1]{\luaexec{
   _ , count = string.gsub ( \luastring{#1} , "~" , "~" )
   tex.sprint ( count ) }}
\begin{document}
\tildecount{This~is a ~test}

\tildecount{~~~~----&&&&****____####~~~~$$$$~~~~}
\end{document}

附录:该\tildecount宏可以很容易地推广到接受第二个输入,,应计算其出现次数的字符串。通用宏的代码如下:

\newcommand\StringCount[2]{\luaexec{
   _ , count = string.gsub ( \luastring{#2} , \luastring{#1} , "" )
   tex.sprint ( count ) }}

例如,该宏可以用作

\StringCount{yes}{a yes b yes c yes desyesfg mess ij}

(结果:4)或

\StringCount{es}{a yes b mesh c best less xxDavieszz mess ij} 

(结果:6)。

答案3

一种listofitems方法。

\documentclass{article}
\usepackage{listofitems}
\newcommand\countem[2]{%
  \setsepchar{#1}%
  \readlist\countlist{#2}%
  \the\numexpr\listlen\countlist[]-1\relax
}
\begin{document}
\countem{~}{This~is a ~test}

\countem{es}{a yes b mesh c best less xxDavieszz mess ij} 
\end{document}

MWE 给出了2和的适当答案6

答案4

考虑substr.sty

添加\usepackage{substr}并尝试

\CountSubStrings{~}{This~is a ~test} % -> 2

或者

\newcounter{foo}
\SubStringsToCounter{foo}{;}{1;2;3;4}
\stepcounter{foo}
% \thefoo -> 4

相关内容