Truncate strings to maximum length
125 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I have an array of strings (new strings, not old character arrays) of varying lengths, and I would like to truncate them to below some maximum length. I thought that extractBefore would be helpful, but it fails for strings shorter than the truncation length.
>> str = ["ab", "cdefg"];
>> extractBefore(str, 3) % this works fine
ans =
1×2 string array
"ab" "cd"
>> extractBefore(str, 4) % this fails
Error using extractBefore
Numeric value exceeds the number of characters in element 1.
This is my current solution:
>> arrayfun(@(s)extractBefore(s, min(4, s.strlength())+1), str)
ans =
1×2 string array
"ab" "cdef"
However, this is awkward and difficult to read.
Is there no ready-made functionality for doing this?
1 commentaire
dpb
le 21 Oct 2024
"Is there no ready-made functionality for doing this?"
Amazingly, no...with everything they did add, the equivalent of MID$, LEFT$, RIGHT$ are not available in a directly-callable functional form.
Réponses (2)
Jan
le 16 Fév 2023
Modifié(e) : Jan
le 16 Fév 2023
Omit arrayfun:
str = ["ab", "cdefg"];
extractBefore(str, min(4, str.strlength())+1)
If this still looks to clumsy, write your own function:
limitWidth(str, 4)
function s = limitWidth(s, n)
s = extractBefore(s, min(n, s.strlength()) + 1);
end
0 commentaires
Stephen23
le 16 Fév 2023
Modifié(e) : Stephen23
le 31 Oct 2024 à 0:07
str = ["", "ab", "1234", "cdefgh"];
out = regexprep(str,'^(.{1,4}).*?$','$1') % LEFT
out = regexprep(str,'^.*?(.{1,4})$','$1') % RIGHT
or (but note the behavior of the empty string):
out = regexp(str,'^.{1,4}','match','once') % LEFT
out = regexp(str,'.{1,4}$','match','once') % RIGHT
4 commentaires
dpb
le 31 Oct 2024 à 11:47
Modifié(e) : dpb
le 31 Oct 2024 à 13:21
@Stephen23, by writing the function names with the $ sign, I was presuming it would be clear the intent was to mimic BASIC (and VBA) which originally required the trailing $ on string variables. Current dialects have dropped the $ convention, of course, but the functionality is retained.
The definition of MID$
res=mid(str,start,[len])
to pick up to len characters from str beginning at start position in str. If omitted, the rest of the original string is returned, in which case it mimics RIGHT$.
It doesn't mean to try to split the string midway so there's no dependency on whether the string length is even/odd nor any ambiguity in the result.
Stephen23
le 31 Oct 2024 à 13:28
Perhaps:
str = ["", "ab", "1234", "cdefgh"];
out = regexprep(str,'^.{0,2}(.{0,4}).*$','$1') % MID(START,LEN)
Voir également
Catégories
En savoir plus sur Error Detection and Correction dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!