【发布时间】:2023-03-05 22:04:01
【问题描述】:
我输入了类似以下示例的输入,并且只需要替换所有\input{.*} 命令,这些命令不是前面是%。
输入是 LaTeX 代码,% 开始注释。这意味着当前行上% 之后的所有内容不应被解释为实际代码,而实际上只是一个注释。 (即使它看起来像代码)
示例输入:
this is \input{REAL.tex} real content % \input{COMMENT.tex}
foo \input{REAL.tex} bar
\input{REAL.tex}
%\input{COMMENT.tex}
\input{REAL.tex} % comment
我当前的代码:
$r = "/^(?P<prefix>(?!.*%).*)\\\\input[{\s]+(?P<filename>.*?)[\s}](?P<suffix>.*)$/m";
$data = preg_replace($r, "REPLACED", $data);
echo $data . PHP_EOL;
CURRENT 示例输出:
this is \input{REAL.tex} real content % \input{COMMENT.tex}
foo REPLACED bar
REPLACED
%\input{COMMENT.tex}
\input{REAL.tex} % comment
预期示例输出:
this is REPLACED real content % \input{COMMENT.tex}
foo REPLACED bar
REPLACED
%\input{COMMENT.tex}
REPLACED % comment
问题:不幸的是,我的正则表达式完全忽略了第一行和最后一行中的\inputs,因为中间有% 注释,由于前瞻断言(?!.*%)。
问题:您是否发现了一种通过正则表达式实现所需输出的方法?第一行和最后一行的\input{REAL.tex} 也应该被替换。
【问题讨论】:
标签: php regex pcre regex-lookarounds