java - String.replaceAll() जावा 9 से जावा 8 में अलग तरीके से काम क्यों करता है?



regex java-8 (1)

JDK-6609854 और JDK-8189343 कारण सबसे अधिक संभावना है, जिसने नकारात्मक नेस्टेड चरित्र वर्गों को संभालने की सूचना दी (आपके उदाहरण में [^[0-9-]] )। यह व्यवहार 9 और 10 में तय किया गया था, लेकिन फिक्स को वापस नहीं भेजा गया था। 8 जावा के लिए बग के रूप में समझाया गया है:

जावा में, नेस्टेड [brackets] में दिखाई देने वाली किसी भी चीज पर नकारात्मक प्रभाव नहीं पड़ता है

इसलिए [^c] "c" से मेल नहीं खाता, जैसा कि आप उम्मीद करेंगे।

[^[c]] "सी" से मेल खाता है। वह नहीं जिसकी मुझे उम्मीद होगी।

[[^c]] "c" से मेल नहीं खाता

रेंज या प्रॉपर्टी एक्सप्रेशन के लिए भी यही सही है - अगर वे ब्रैकेट के अंदर हैं, तो आउट लेवल पर एक नेगेटिव असर नहीं करता है।

[^az] इसके विपरीत है [^[az]]

क्यों यह कोड java-8 में 02 आउटपुट करता है, लेकिन java-9 या इसके बाद के संस्करण में o2 है?

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





java-9