You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Maksym Korshun (Jira)" <ji...@apache.org> on 2026/07/29 20:14:00 UTC

[jira] [Updated] (TEXT-241) TextStringBuilder.lastIndexOf("") (and deprecated StrBuilder.lastIndexOf("")) returns incorrect index (size - 1 instead of size) when searching for an empty string.

     [ https://issues.apache.org/jira/browse/TEXT-241?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Maksym Korshun updated TEXT-241:
--------------------------------
    Description: 
{{StrBuilder.lastIndexOf(String)}} and {{TextStringBuilder.lastIndexOf(String)}}
do not match {{java.lang.String}} / {{StringBuilder}} for the empty string.
 
For a builder of length n, {{lastIndexOf("")}} should return n (empty match
at the end). Both implementations currently return n - 1.
 
Cause:
{{lastIndexOf(String, int)}} clamps {{startIndex}} with:
{{startIndex = startIndex >= size ? size - 1 : startIndex}}
before the empty-string case, which returns that clamped index. So
{{lastIndexOf("")}} can never return size.
 
Example:
 
{code:java}
new StrBuilder("abab").lastIndexOf("") // actual 3, expected 4
"abab".lastIndexOf("") // 4
new StringBuilder("abab").lastIndexOf("") // 4
{code}

Same issue in {{TextStringBuilder}}.
 
Fix:
In {{lastIndexOf(String, int)}}, for an empty search string allow the start
index up to size and return that, keep the existing size - 1 clamp for non-empty strings.
 
Affects:
- org.apache.commons.text.StrBuilder
- org.apache.commons.text.TextStringBuilder
 
        Summary: TextStringBuilder.lastIndexOf("") (and deprecated StrBuilder.lastIndexOf("")) returns incorrect index (size - 1 instead of size) when searching for an empty string.  (was: lastIndexOf(String) returns incorrect result for empty search string)

> TextStringBuilder.lastIndexOf("") (and deprecated StrBuilder.lastIndexOf("")) returns incorrect index (size - 1 instead of size) when searching for an empty string.
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: TEXT-241
>                 URL: https://issues.apache.org/jira/browse/TEXT-241
>             Project: Commons Text
>          Issue Type: Bug
>            Reporter: Maksym Korshun
>            Priority: Minor
>
> {{StrBuilder.lastIndexOf(String)}} and {{TextStringBuilder.lastIndexOf(String)}}
> do not match {{java.lang.String}} / {{StringBuilder}} for the empty string.
>  
> For a builder of length n, {{lastIndexOf("")}} should return n (empty match
> at the end). Both implementations currently return n - 1.
>  
> Cause:
> {{lastIndexOf(String, int)}} clamps {{startIndex}} with:
> {{startIndex = startIndex >= size ? size - 1 : startIndex}}
> before the empty-string case, which returns that clamped index. So
> {{lastIndexOf("")}} can never return size.
>  
> Example:
>  
> {code:java}
> new StrBuilder("abab").lastIndexOf("") // actual 3, expected 4
> "abab".lastIndexOf("") // 4
> new StringBuilder("abab").lastIndexOf("") // 4
> {code}
> Same issue in {{TextStringBuilder}}.
>  
> Fix:
> In {{lastIndexOf(String, int)}}, for an empty search string allow the start
> index up to size and return that, keep the existing size - 1 clamp for non-empty strings.
>  
> Affects:
> - org.apache.commons.text.StrBuilder
> - org.apache.commons.text.TextStringBuilder
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)