Why String.replaceAll() works differently in Java 8 from Java 9What is the difference between String and...

What is the purpose of easy combat scenarios that don't need resource expenditure?

If I delete my router's history can my ISP still provide it to my parents?

What are jets (units)?

Typing Amharic inside a math equation?

Why Normality assumption in linear regression

Early credit roll before the end of the film

Why String.replaceAll() works differently in Java 8 from Java 9

Caruana vs Carlsen game 10 (WCC) why not 18...Nxb6?

Why avoid shared user accounts?

What kind of hardware implements Fourier transform?

Why did other German political parties disband so fast when Hitler was appointed chancellor?

What is the wife of a henpecked husband called?

Would these multi-classing house rules cause unintended problems?

How would an AI self awareness kill switch work?

Does Windows 10's telemetry include sending *.doc files if Word crashed?

How can I install sudo without using su?

Why are the books in the Game of Thrones citadel library shelved spine inwards?

We are very unlucky in my court

How to explain planetary rings pulsating?

What's a good word to describe a public place that looks like it wouldn't be rough?

Broken patches on a road

What to do when being responsible for data protection in your lab, yet advice is ignored?

Avoiding morning and evening handshakes

Can I write a book of my D&D game?



Why String.replaceAll() works differently in Java 8 from Java 9


What is the difference between String and string in C#?What is reflection and why is it useful?Is Java “pass-by-reference” or “pass-by-value”?How do I read / convert an InputStream into a String in Java?Regular expression to match a line that doesn't contain a word?Why is subtracting these two times (in 1927) giving a strange result?Why is char[] preferred over String for passwords?Why is it faster to process a sorted array than an unsorted array?Why is printing “B” dramatically slower than printing “#”?Why is executing Java code in comments with certain Unicode characters allowed?













8















Why this piece of code outputs 02 in java-8 but o2 in java-9 or above?



"o2".replaceAll("([oO])([^[0-9-]])", "0$2")









share|improve this question




















  • 1





    A simplification of the code that still shows the behaviour : Pattern.matches("[^[x]]", "x") returns true with JDK8 and false with JDK9+.

    – Aaron
    1 hour ago


















8















Why this piece of code outputs 02 in java-8 but o2 in java-9 or above?



"o2".replaceAll("([oO])([^[0-9-]])", "0$2")









share|improve this question




















  • 1





    A simplification of the code that still shows the behaviour : Pattern.matches("[^[x]]", "x") returns true with JDK8 and false with JDK9+.

    – Aaron
    1 hour ago
















8












8








8


5






Why this piece of code outputs 02 in java-8 but o2 in java-9 or above?



"o2".replaceAll("([oO])([^[0-9-]])", "0$2")









share|improve this question
















Why this piece of code outputs 02 in java-8 but o2 in java-9 or above?



"o2".replaceAll("([oO])([^[0-9-]])", "0$2")






java regex string java-8 java-9






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 1 hour ago









nullpointer

43.3k10101200




43.3k10101200










asked 1 hour ago









Fuyang LiuFuyang Liu

492315




492315








  • 1





    A simplification of the code that still shows the behaviour : Pattern.matches("[^[x]]", "x") returns true with JDK8 and false with JDK9+.

    – Aaron
    1 hour ago
















  • 1





    A simplification of the code that still shows the behaviour : Pattern.matches("[^[x]]", "x") returns true with JDK8 and false with JDK9+.

    – Aaron
    1 hour ago










1




1





A simplification of the code that still shows the behaviour : Pattern.matches("[^[x]]", "x") returns true with JDK8 and false with JDK9+.

– Aaron
1 hour ago







A simplification of the code that still shows the behaviour : Pattern.matches("[^[x]]", "x") returns true with JDK8 and false with JDK9+.

– Aaron
1 hour ago














1 Answer
1






active

oldest

votes


















11














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 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]]







share|improve this answer





















  • 4





    You can't prove the regex does not match the string at regex101, it does not support character class union. In PCRE, [^[0-9-]] matches a char that is not [, digit and - and then a ].

    – Wiktor Stribiżew
    1 hour ago













  • @WiktorStribiżew removed, thanks. Would you suggest some other online tool that supports them?

    – Karol Dowbecki
    1 hour ago








  • 1





    Use RegexPlanet

    – Wiktor Stribiżew
    1 hour ago






  • 1





    In case it's not obvious -- the OP can fix this inconsistency by changing [^[0-9-]] to [^0-9-].

    – ruakh
    1 hour ago











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54946363%2fwhy-string-replaceall-works-differently-in-java-8-from-java-9%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









11














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 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]]







share|improve this answer





















  • 4





    You can't prove the regex does not match the string at regex101, it does not support character class union. In PCRE, [^[0-9-]] matches a char that is not [, digit and - and then a ].

    – Wiktor Stribiżew
    1 hour ago













  • @WiktorStribiżew removed, thanks. Would you suggest some other online tool that supports them?

    – Karol Dowbecki
    1 hour ago








  • 1





    Use RegexPlanet

    – Wiktor Stribiżew
    1 hour ago






  • 1





    In case it's not obvious -- the OP can fix this inconsistency by changing [^[0-9-]] to [^0-9-].

    – ruakh
    1 hour ago
















11














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 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]]







share|improve this answer





















  • 4





    You can't prove the regex does not match the string at regex101, it does not support character class union. In PCRE, [^[0-9-]] matches a char that is not [, digit and - and then a ].

    – Wiktor Stribiżew
    1 hour ago













  • @WiktorStribiżew removed, thanks. Would you suggest some other online tool that supports them?

    – Karol Dowbecki
    1 hour ago








  • 1





    Use RegexPlanet

    – Wiktor Stribiżew
    1 hour ago






  • 1





    In case it's not obvious -- the OP can fix this inconsistency by changing [^[0-9-]] to [^0-9-].

    – ruakh
    1 hour ago














11












11








11







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 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]]







share|improve this answer















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 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]]








share|improve this answer














share|improve this answer



share|improve this answer








edited 1 hour ago

























answered 1 hour ago









Karol DowbeckiKarol Dowbecki

22.5k93355




22.5k93355








  • 4





    You can't prove the regex does not match the string at regex101, it does not support character class union. In PCRE, [^[0-9-]] matches a char that is not [, digit and - and then a ].

    – Wiktor Stribiżew
    1 hour ago













  • @WiktorStribiżew removed, thanks. Would you suggest some other online tool that supports them?

    – Karol Dowbecki
    1 hour ago








  • 1





    Use RegexPlanet

    – Wiktor Stribiżew
    1 hour ago






  • 1





    In case it's not obvious -- the OP can fix this inconsistency by changing [^[0-9-]] to [^0-9-].

    – ruakh
    1 hour ago














  • 4





    You can't prove the regex does not match the string at regex101, it does not support character class union. In PCRE, [^[0-9-]] matches a char that is not [, digit and - and then a ].

    – Wiktor Stribiżew
    1 hour ago













  • @WiktorStribiżew removed, thanks. Would you suggest some other online tool that supports them?

    – Karol Dowbecki
    1 hour ago








  • 1





    Use RegexPlanet

    – Wiktor Stribiżew
    1 hour ago






  • 1





    In case it's not obvious -- the OP can fix this inconsistency by changing [^[0-9-]] to [^0-9-].

    – ruakh
    1 hour ago








4




4





You can't prove the regex does not match the string at regex101, it does not support character class union. In PCRE, [^[0-9-]] matches a char that is not [, digit and - and then a ].

– Wiktor Stribiżew
1 hour ago







You can't prove the regex does not match the string at regex101, it does not support character class union. In PCRE, [^[0-9-]] matches a char that is not [, digit and - and then a ].

– Wiktor Stribiżew
1 hour ago















@WiktorStribiżew removed, thanks. Would you suggest some other online tool that supports them?

– Karol Dowbecki
1 hour ago







@WiktorStribiżew removed, thanks. Would you suggest some other online tool that supports them?

– Karol Dowbecki
1 hour ago






1




1





Use RegexPlanet

– Wiktor Stribiżew
1 hour ago





Use RegexPlanet

– Wiktor Stribiżew
1 hour ago




1




1





In case it's not obvious -- the OP can fix this inconsistency by changing [^[0-9-]] to [^0-9-].

– ruakh
1 hour ago





In case it's not obvious -- the OP can fix this inconsistency by changing [^[0-9-]] to [^0-9-].

– ruakh
1 hour ago




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54946363%2fwhy-string-replaceall-works-differently-in-java-8-from-java-9%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

“%fieldName is a required field.”, in Magento2 REST API Call for GET Method Type The Next...

How to change City field to a dropdown in Checkout step Magento 2Magento 2 : How to change UI field(s)...

夢乃愛華...