Truncate strings to maximum length

조회 수: 125 (최근 30일)
DNF
DNF 2023년 2월 16일
댓글: Stephen23 2024년 10월 31일 13:28
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
dpb
dpb 2024년 10월 21일
"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.

댓글을 달려면 로그인하십시오.

답변 (2개)

Jan
Jan 2023년 2월 16일
편집: Jan 2023년 2월 16일
Omit arrayfun:
str = ["ab", "cdefg"];
extractBefore(str, min(4, str.strlength())+1)
ans = 1×2 string array
"ab" "cdef"
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

Stephen23
Stephen23 2023년 2월 16일
편집: Stephen23 2024년 10월 31일 0:07
str = ["", "ab", "1234", "cdefgh"];
out = regexprep(str,'^(.{1,4}).*?$','$1') % LEFT
out = 1x4 string array
"" "ab" "1234" "cdef"
out = regexprep(str,'^.*?(.{1,4})$','$1') % RIGHT
out = 1x4 string array
"" "ab" "1234" "efgh"
or (but note the behavior of the empty string):
out = regexp(str,'^.{1,4}','match','once') % LEFT
out = 1x4 string array
<missing> "ab" "1234" "cdef"
out = regexp(str,'.{1,4}$','match','once') % RIGHT
out = 1x4 string array
<missing> "ab" "1234" "efgh"
  댓글 수: 4
dpb
dpb 2024년 10월 31일 11:47
편집: dpb 2024년 10월 31일 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
Stephen23 2024년 10월 31일 13:28
Perhaps:
str = ["", "ab", "1234", "cdefgh"];
out = regexprep(str,'^.{0,2}(.{0,4}).*$','$1') % MID(START,LEN)
out = 1x4 string array
"" "" "34" "efgh"

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Error Detection and Correction에 대해 자세히 알아보기

태그

제품


릴리스

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by