我承认我对正则表达式还不熟悉。该l3regex
模块有一个函数\regex_match:
,用于测试正则表达式(第一个参数)是否与标记列表(第二个参数)的任何部分匹配。我很好奇是否有一个函数可以测试正则表达式是否与整个标记列表匹配,而不是部分子匹配。
例如,假设我有一个函数,用于测试输入的形式是恰好 1 位数字还是恰好 2 位数字。据我所知,我的第一个示例函数将正确测试这是否正确,但我觉得这应该更容易。(ERROR
只是一个占位符错误消息。)不幸的是,我的第二个示例函数将设置正则表达式匹配至少有 1 位数字的任何标记列表,即使标记列表不能包含任何非数字(例如字母)。
\documentclass{article}
\begin{document}
\ExplSyntaxOn
%first example function
%\cs_new:Nn \mymodule_checkiftwodigits:n
%{
% \str_set:Nx \l_tmpa_str { #1 }
% \int_compare:nNnT { \str_count:N \l_tmpa_str } > { 2 }
% { ERROR }
% \str_map_inline:Nn \l_tmpa_str
% {
% \regex_match:nnTF { \d } { ##1 }
% { MATCH }
% { NO~ MATCH }
% }
%}
%second example function
\cs_new:Nn \mymodule_checkiftwodigits:n
{
\regex_match:nnTF { \d{1,2} } { #1 }
{ MATCH }
{ NO~ MATCH }
}
%\mymodule_checkiftwodigits:n {abc }
\mymodule_checkiftwodigits:n {123}%incorrectly matches
\par
\mymodule_checkiftwodigits:n {1a}%incorrectly matches
\par
\mymodule_checkiftwodigits:n {abc}%correct
%i understand that the \regex_match: function is working as intended.
\ExplSyntaxOff
\end{document}
答案1
如果这是一个标准(PCRE)正则表达式,我建议固定开始和结束,即^\d{1,2}$
。
经过简单测试,锚定在 l3regex 中也有效。你想要的代码是:
\cs_new:Nn \mymodule_checkiftwodigits:n
{
\regex_match:nnTF { ^\d{1,2}$ } { #1 }% first parameter changed
{ MATCH }
{ NO~ MATCH }
}
当我将此更改放入您的文档中时,它出现了NO MATCH
3 次。添加一行\mymodule_checkiftwodigits:n {56}
会导致MATCH
。