Skip to content

Fix case-insensitive Strings.replace dropping length-changing matches#1697

Merged
garydgregory merged 1 commit into
apache:masterfrom
alhudz:strings-ci-replace-lowercase
Jun 9, 2026
Merged

Fix case-insensitive Strings.replace dropping length-changing matches#1697
garydgregory merged 1 commit into
apache:masterfrom
alhudz:strings-ci-replace-lowercase

Conversation

@alhudz

@alhudz alhudz commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Repro: Strings.CI.replace("aİb", "İ", "X", -1) returns aİb instead of aXb under any non-Turkish locale (StringUtils.replaceIgnoreCase/replaceOnceIgnoreCase delegate here, so they are affected too).
Cause: replace lower-cases the search argument up front, but the case-insensitive indexOf it calls already matches case-insensitively through CharSequenceUtils.regionMatches. 'İ' (U+0130) lower-cases to the two-char "i̇", so both the needle and the derived replLength grow to length 2 and stop lining up with the single source character, so the match is silently dropped.
Fix: remove the redundant lower-casing and let the case-insensitive indexOf do the matching. The case-sensitive path never lower-cased, so it is unchanged.

The regression test pins the locale with @DefaultLocale("en") so the lower-case expansion is deterministic; it fails on the current code and passes with the fix.

  • Read the contribution guidelines for this project.
  • Read the ASF Generative Tooling Guidance if you use Artificial Intelligence (AI).
  • I used AI to create any part of, or all of, this pull request. Which AI tool was used to create this pull request, and to what extent did it contribute?
  • Run a successful build using the default Maven goal with mvn; that's mvn on the command line by itself.
  • Write unit tests that match behavioral changes, where the tests fail if the changes to the runtime are not applied. This may not always be possible, but it is a best practice.
  • Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
  • Each commit in the pull request should have a meaningful subject line and body. Note that a maintainer may squash commits during the merge process.

@garydgregory garydgregory changed the title fix case-insensitive Strings.replace dropping length-changing matches Fix case-insensitive Strings.replace dropping length-changing matches Jun 9, 2026
@garydgregory garydgregory merged commit 2c37484 into apache:master Jun 9, 2026
20 of 21 checks passed
@garydgregory

Copy link
Copy Markdown
Member

Thank you @alhudz , merged 🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants