Why does this code output 02
in java-8 but o2
in java-9 or above?
"o2".replaceAll("([oO])([^[0-9-]])", "0$2")
The replaceAll() method is similar to the String. replaceFirst() method. The only difference between them is that it replaces the sub-string with the given string for all the occurrences present in the string.
The replaceAll() method returns a new string with all matches of a pattern replaced by a replacement . The pattern can be a string or a RegExp , and the replacement can be a string or a function to be called for each match. The original string is left unchanged.
The replaceAll() method replaces each substring of this string that matches the given regular expression with the given replacement.
The Java String replaceAll() returns a string after it replaces each substring of that matches the given regular expression with the given replacement.
Most likely due to JDK-6609854 and JDK-8189343 which reported negative nested character classes handling (in your example [^[0-9-]]
). This behavior was fixed in 9 and 10, but fix was not backported to 8. The bug for Java 8 is explained as:
In Java, the negation does not apply to anything appearing in nested
[brackets]
So
[^c]
does not match "c", as you would expect.
[^[c]]
does match "c". Not what I would expect.
[[^c]]
does not match "c"The same holds true for ranges or property expressions - if they're inside brackets, a negation at an out level does not affect them.
[^a-z]
is opposite from[^[a-z]]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With