इस जवाब में @nhahtdh की बहुत मदद से https://stackoverflow.com/a/21943960/3112803 मैंने इसे सबसे अच्छा समाधान होने के लिए तोड़ दिया है। PL/SQL
में इसे कैसे करना है इसका एक उदाहरण नीचे दिया गया है , लेकिन इसे अन्य भाषाओं में इस तरह से किया जा सकता है। मैं ColdFusion
. में भी ऐसा ही करूँगा . PL/SQL
के लिए 512 वर्णों के नीचे रहने के लिए आवश्यक पैटर्न इसलिए इसे तोड़ना बहुत अच्छा काम करता है और इसे समझना आसान है। इसने मेरे सभी परीक्षण मामलों को मूल प्रश्न में पास कर दिया।
if (
/* IPv6 expanded */
REGEXP_LIKE(v, '\A[[:xdigit:]]{1,4}(:[[:xdigit:]]{1,4}){7}\z')
/* IPv6 shorthand */
OR (NOT REGEXP_LIKE(v, '\A(.*?[[:xdigit:]](:|\z)){8}')
AND REGEXP_LIKE(v, '\A([[:xdigit:]]{1,4}(:[[:xdigit:]]{1,4}){0,6})?::([[:xdigit:]]{1,4}(:[[:xdigit:]]{1,4}){0,6})?\z'))
/* IPv6 dotted-quad notation, expanded */
OR REGEXP_LIKE(v, '\A[[:xdigit:]]{1,4}(:[[:xdigit:]]{1,4}){5}:(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}\z')
/* IPv6 dotted-quad notation, shorthand */
OR (NOT REGEXP_LIKE(v, '\A(.*?[[:xdigit:]]:){6}')
AND REGEXP_LIKE(v, '\A([[:xdigit:]]{1,4}(:[[:xdigit:]]{1,4}){0,4})?::([[:xdigit:]]{1,4}:){0,5}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}\z'))
) then