Substring look-up

Olivier Boudeville olivier.boudeville@REDACTED
Tue Apr 6 23:29:25 CEST 2021


Hi,

It must be a silly question, but, since the Latin1 -> Unicode switch in 
OTP 20.0, is there a (non-obsolete) way in the string module to look-up 
the index of a string into another one, i.e. to find the location of a 
given substring?

rstr/2 is supposed to be replaced with find/3, yet the former returns an 
index whereas the latter returns a part of the original string. I could 
not find a way to obtain a relevant index with any of the newer string 
functions - whereas I would guess it is a fairly common need?

To give a bit more context, the goal was to prevent the implementation 
of [1] from becoming obsolete; string:substr/3 and string:sub_string/3 
are flagged as obsolete and may be replaced by slice/3 (see [2]); yet 
what can be done for rstr/2?

(even if a smart use of some function was found to address the 
particular need of this replace_extension/3 function, obtaining indexes 
of substrings would still be useful in many cases, isn't it?)

Thanks in advance for any hint!

Best regards,

Olivier.


[1] Soon obsolete apparently:

% Returns a new filename whose extension has been updated.
%
% Ex: replace_extension("/home/jack/rosie.ttf", ".ttf", ".wav") should 
return
% "/home/jack/rosie.wav".
%
-spec replace_extension( file_path(), extension(), extension() ) -> 
file_path().
replace_extension( FilePath, SourceExtension, TargetExtension ) ->

     case string:rstr( FilePath, SourceExtension ) of

         0 ->
             throw( { extension_not_found, SourceExtension, FilePath } );

         Index ->
             string:substr( FilePath, 1, Index-1 ) ++ TargetExtension

     end.


[2] BTW there is a change in the indexing convention that could be 
better advertised in the doc:

 > string:substr("abc",1).
"abc"

 > string:sub_string("abc",1).
"abc"

 > string:slice("abc",1).
"bc"

 > string:slice("abc",0).
"abc"

-- 
Olivier Boudeville



More information about the erlang-questions mailing list