Re: expl3 test if a string starts with a given prefix
Marei Peischl via texhax <[email protected]> Sat, 15 Nov 2025 18:33:47 +0100
| Newsgroups | gmane.comp.tex.texhax |
|---|---|
| Message-ID | <[email protected]> |
Hi Karl,
you can use \regex_if_match, which you could even extend to check https
the same way:
e.g.
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\regex_if_match:nnTF {^https?://} {http://xxxxxxx}
{ \message{prefix} }
{ \message{notprefix} }
\end{document}
Best,
Marei
On 15/11/2025 18.24, Karl Berry wrote:
> Using expl3, I'd like to test if a given "string" (argument) starts with
> a given prefix, namely "http://". For a prefix of a given length, 7 in
> my case, I guess the idea is to extract the first 7 tokens using
> str_range and then compare them with \str_if_eq? But I cannot get the
> details right. Here's my best attempt (with help from various bots). Is
> it at all close?
>
> \documentclass{article}
> \begin{document}
> \ExplSyntaxOn
> \cs_new:Npn \astr_if_starts_with:nnTF #1#2
> {
> % #1 = prefix to test
> % #2 = full string
> \str_if_eq:nnTF
> { \str_range:nnn {#2} {1} { \str_count:n {#1} } }
> { #1 }
> }
> \str_if_starts_with:nnTF {abc} {abcdef}
> { \message{prefix} }
> { \message{notprefix} }
> \end{document}
>
> This feels like an easy expl3 programming question, but evidently I've
> failed to grok interface3.pdf.
>
> FWIW, the real context is this, from tugboat.dtx (with thanks to
> Ulrike):
>
> \def\tbsurl@#1
> {
> \str_set:Nn\l_tmpa_str{#1}
> \str_if_in:NnTF \l_tmpa_str {http://}
> ... % an http:// url
>
> where I need to replace \str_if_in with some other function that checks
> if http:// is only the *beginning* of \l_tmpa_str, not anywhere within
> it. Because archive.org routinely embeds "http://" in their urls,
> e.g., https://web.archive.org/web/20090809184749/http://www.eco-log.de/
>
> Thanks,
> Karl